";
}
function updateRecord () {
//print "Updating domain ...";
if (!$_REQUEST['domain_filter']) return false;
if (!$domain = $this->getRecord($_REQUEST['domain_filter'])) {
return false;
}
$domain_old=$domain;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$domain->$item = intval($_REQUEST[$var_name] == 1);
} else if ($this->Fields[$item]['type'] == 'boolean') {
$domain->$item = intval($_REQUEST[$var_name]);
} else {
$domain->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$domain->$item = intval($_REQUEST[$var_name]);
} else if ($this->Fields[$item]['type'] == 'boolean') {
$domain->$item = intval($_REQUEST[$var_name]);
} else {
$domain->$item = trim($_REQUEST[$var_name]);
}
}
}
$function=array('commit' => array('name' => 'updateDomain',
'parameters' => array($domain),
'logs' => array('success' => sprintf('Domain %s has been updated',$domain->domain)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function hide_html() {
if ($_REQUEST['action'] == 'Export') {
return true;
} else {
return false;
}
}
function exportDomain($domain) {
$exported_data= array();
// Filter
$filter=array(
'domain' => $domain,
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 1000
);
// Compose query
$Query=array('filter' => $filter,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$i = 0 ;
while ($i < $result->total) {
$domain = $result->domains[$i];
if (!in_array($domain->customer, $export_customers)) {
$export_customers[]=$domain->customer;
}
if (!in_array($domain->reseller, $export_customers)) {
$export_customers[]=$domain->reseller;
}
$i+=1;
$exported_data['sip_domains'][] = objectToArray($domain);
}
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,'getAccounts'),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['sip_accounts'] = objectToArray($result->accounts);
foreach ($result->accounts as $account) {
if (!in_array($account->owner, $export_customers)) {
$export_customers[]=$account->owner;
}
$sipId=array("username" => $account->id->username,
"domain" => $account->id->domain
);
$this->SoapEngine->soapclientVoicemail->addHeader($this->SoapEngine->SoapAuthVoicemail);
$result = $this->SoapEngine->soapclientVoicemail->getAccount($sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") {
printf ("
Error (VoicemailPort): %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
}
} else {
$exported_data['voicemail_accounts'][] = $result;
}
// Filter
$filter=array('targetUsername' => $account->id->username,
'targetDomain' => $account->id->domain
);
// Range
$range=array('start' => 0,
'count' => 20
);
// Compose query
$Query=array('filter' => $filter,
'range' => $range
);
// Call function
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAliases');
$result = $this->SoapEngine->soapclient->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("
Error (SipPort): %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
} else {
foreach ($result->aliases as $alias) {
$exported_data['sip_aliases'][] = objectToArray($alias);
}
}
}
}
foreach ($export_customers as $customer) {
if (!$customer) {
continue;
}
$filter=array(
'customer' => intval($customer),
);
// Compose query
$Query=array('filter' => $filter
);
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getCustomers');
// Call function
$result = $this->SoapEngine->soapclientCustomers->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['customers'] = objectToArray($result->accounts);
}
}
//print_r($exported_data['customers']);
print_r(json_encode($exported_data));
}
}
class SipAccounts extends Records {
var $selectionActiveExceptions=array('domain');
var $sortElements=array('changeDate' => 'Change date',
'username' => 'Username',
'domain' => 'Domain'
);
var $store_clear_text_passwords=true;
var $default_account_type = 'postpaid';
var $group_filter_list = array('blocked' => 'Blocked',
'quota' => 'Quota Exceeded',
'prepaid' => 'Prepaid',
'free-pstn' => 'PSTN Access',
'anonymous' => 'Anonymous',
'anonymous-reject' => 'Reject Anonymous',
'voicemail' => 'Has Voicemail',
'missed-calls' => 'Missed Calls',
'trunking' => 'Trunking'
);
function SipAccounts($SoapEngine) {
dprint("init SipAccounts");
$this->filters = array('username' => strtolower(trim($_REQUEST['username_filter'])),
'domain' => strtolower(trim($_REQUEST['domain_filter'])),
'firstname'=> trim($_REQUEST['firstname_filter']),
'lastname' => trim($_REQUEST['lastname_filter']),
'email' => trim($_REQUEST['email_filter']),
'owner' => trim($_REQUEST['owner_filter']),
'customer' => trim($_REQUEST['customer_filter']),
'reseller' => trim($_REQUEST['reseller_filter']),
'group' => trim($_REQUEST['group_filter'])
);
$this->Records($SoapEngine);
if (strlen($this->SoapEngine->call_limit)) {
$this->platform_call_limit = $this->SoapEngine->call_limit;
} else {
$this->platform_call_limit;
}
$this->getTimezones();
}
function getRecordKeys() {
if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) {
$this->filters['username'] = $m[1];
$this->filters['domain'] = $m[2];
}
// Filter
$filter=array('username' => $this->filters['username'],
'domain' => $this->filters['domain'],
'firstName'=> $this->filters['firstname'],
'lastName' => $this->filters['lastname'],
'email' => $this->filters['email'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller']),
'groups' => array($this->filters['group'])
);
// Range
$range=array('start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
// Call function
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->accounts as $account) {
$this->selectionKeys[]=array('username' => $account->id->username,
'domain' => $account->id->domain
);
}
return true;
}
return false;
}
function listRecords() {
$this->getAllowedDomains();
if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) {
$this->filters['username'] = $m[1];
$this->filters['domain'] = $m[2];
}
$this->showSeachForm();
// Filter
$filter=array('username' => $this->filters['username'],
'domain' => $this->filters['domain'],
'firstName'=> $this->filters['firstname'],
'lastName' => $this->filters['lastname'],
'email' => $this->filters['email'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller']),
'groups' => array($this->filters['group'])
);
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credentials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
// Call function
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $action != 'PerformActions' && $action != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id
SIP account";
$this->showSortCaret('username');
if ($this->sorting['sortBy'] == 'domain' ) {
print " (domain ";
$this->showSortCaret('domain');
print ")";
}
print "
Full name
Email address
Timezone
Capacity
Quota
Balance
Owner
Change date";
$this->showSortCaret('changeDate');
print "
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
if ($this->rows) {
$i=0;
$_prepaid_accounts=array();
while ($i < $maxrows) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
if ($account->prepaid) {
$_prepaid_accounts[]=array("username" => $account->id->username,
"domain" => $account->id->domain
);
}
$i++;
}
if (count($_prepaid_accounts)) {
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getPrepaidStatus');
// Call function
$result1 = $this->SoapEngine->soapclient->getPrepaidStatus($_prepaid_accounts);
if (!(new PEAR)->isError($result1)) {
$j=0;
foreach ($result1 as $_account) {
$_sip_account=sprintf("%s@%s",$_prepaid_accounts[$j]['username'],$_prepaid_accounts[$j]['domain']);
$_prepaid_balance[$_sip_account]=$_account->balance;
$j++;
}
}
}
$i=0;
while ($i < $maxrows) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$index=$this->next+$i+1;
$_url = $this->url.'&'.$this->addFiltersToURL().sprintf("&service=%s&action=Delete",
urlencode($this->SoapEngine->service)
);
if (!$this->filters['domain']) {
$_url .= sprintf("&domain_filter=%s",urlencode($account->id->domain));
}
if (!$this->filters['username']) {
$_url .= sprintf("&username_filter=%s",urlencode($account->id->username));
}
$_url.= sprintf("&key=%s",urlencode($account->id->username));
if ($action == 'Delete' &&
$_REQUEST['key'] == $account->id->username &&
$_REQUEST['domain_filter'] == $account->id->domain) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
if ($account->reseller) {
$reseller_sip_settings_page=$account->reseller;
} else if ($this->SoapEngine->impersonate) {
// use the reseller from the soap engine
$reseller_sip_settings_page=$this->SoapEngine->impersonate;
} else {
// use the reseller from the login
$reseller_sip_settings_page=$this->reseller;
}
if ($this->sip_settings_page) {
$url=sprintf('%s?account=%s@%s&sip_engine=%s',
$this->sip_settings_page,urlencode($account->id->username),$account->id->domain,$this->SoapEngine->sip_engine);
if ($this->adminonly) {
$url .= sprintf('&reseller=%s',$reseller_sip_settings_page);
$url .= sprintf('&adminonly=%s',$this->adminonly);
} else {
if ($account->reseller == $this->reseller) $url .= sprintf('&reseller=%s',$reseller_sip_settings_page);
}
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
$url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element]));
}
$sip_account=sprintf("
%s@%s ",$url,$account->id->username,$account->id->domain);
} else {
$sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain);
}
/*
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($account->customer));
*/
if ($account->owner) {
$_owner_url = sprintf
("%s ",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($account->owner),
$account->owner
);
} else {
$_owner_url='';
}
$prepaid_account=sprintf("%s@%s",$account->id->username,$account->id->domain);
if ($account->callLimit) {
$callLimit = $account->callLimit;
} else if ($this->platform_call_limit) {
$callLimit = $this->platform_call_limit;
} else {
$callLimit = '';
}
printf("
%s
%s
%s %s
%s
%s
%s
%s
%s
%s
%s
%s
",
$index,
$sip_account,
$account->firstName,
$account->lastName,
$account->email,
$account->email,
$account->timezone,
$callLimit,
$account->quota,
$_prepaid_balance[$prepaid_account],
$_owner_url,
$account->changeDate,
$_url,
$actionText
);
$i++;
}
}
print "
";
$this->showPagination($maxrows);
return true;
}
}
function showSeachFormCustom() {
printf ("
Account
",$this->filters['username']);
printf ("@");
if (count($this->allowedDomains) > 0) {
if ($this->filters['domain'] && !in_array($this->filters['domain'],$this->allowedDomains)) {
printf (" ",$this->filters['domain']);
} else {
$selected_domain[$this->filters['domain']]='selected';
printf ("
");
foreach ($this->allowedDomains as $_domain) {
printf (" $_domain\n",$selected_domain[$_domain]);
}
printf (" \n");
}
} else {
printf (" ",$this->filters['domain']);
}
printf (" FN
\n",$this->filters['firstname']);
printf (" LN
\n",$this->filters['lastname']);
printf (" Email
\n",$this->filters['email']);
printf (" Owner
\n",$this->filters['owner']);
$selected_group[$this->filters['group']]='selected';
print "Feature...";
foreach (array_keys($this->group_filter_list) as $key) {
if (!$this->getResellerProperty('pstn_access')) {
if ($key == 'free-pstn' or $key == 'prepaid' or $key == 'quota') {
continue;
}
}
printf(" %s",$key,$selected_group[$key], $this->group_filter_list[$key]);
}
print " ";
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['username']) {
$username=$dictionary['username'];
} else {
$username=$_REQUEST['key'];
}
if ($dictionary['domain']) {
$domain=$dictionary['domain'];
} else {
$domain=$this->filters['domain'];
}
if (!strlen($username) || !strlen($domain)) {
print "
Error: missing SIP account username or domain. ";
return false;
}
$account=array('username' => $username,
'domain' => $domain
);
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array($account),
'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$_REQUEST['key'],$this->filters['domain'])
)
)
);
foreach (array_keys($this->filters) as $_filter) {
if ($_filter == 'username' || $_filter == 'domain') continue;
$new_filters[$_filter]=$this->filters[$_filter];
}
$this->filters=$new_filters;
return $this->SoapEngine->execute($function,$this->html);
}
function showAddForm() {
if ($this->filters['username']) return;
if (!count($this->allowedDomains)) {
print "
You must create at least one SIP domain before adding SIP accounts
";
return false;
}
printf ("",$_SERVER['PHP_SELF']);
print "
";
print "
";
if ($_REQUEST['account']) {
$_account=$_REQUEST['account'];
} else {
$_account=$this->getCustomerProperty('sip_accounts_last_username');
}
printf ("
Account
",$_account);
if ($_REQUEST['domain']) {
$_domain=$_REQUEST['domain'];
$selected_domain[$_REQUEST['domain']]='selected';
} else if ($this->filters['domain']) {
$_domain=$this->filters['domain'];
$selected_domain[$this->filters['domain']]='selected';
} else if ($_domain=$this->getCustomerProperty('sip_accounts_last_domain')) {
$selected_domain[$_domain]='selected';
}
if (count($this->allowedDomains) > 0) {
print "@
";
foreach ($this->allowedDomains as $_domain) {
printf ("%s\n",$_domain,$selected_domain[$_domain],$_domain);
}
print " ";
} else {
printf ("
",$_domain);
}
if ($_REQUEST['quota']) {
$_quota=$_REQUEST['quota'];
} else {
$_quota=$this->getCustomerProperty('sip_accounts_last_quota');
}
if (!$_quota) $_quota='';
if ($_prepaid=$this->getCustomerProperty('sip_accounts_last_prepaid')) {
$checked_prepaid='checked';
} else {
$checked_prepaid='';
}
if ($_pstn=$this->getCustomerProperty('sip_accounts_last_pstn')) {
$checked_pstn='checked';
} else {
$checked_pstn='';
}
printf ("
Password
",$_REQUEST['password']);
printf ("
Name
",$_REQUEST['fullname']);
printf ("
Email
",$_REQUEST['email']);
printf ("
Owner
",$_REQUEST['owner']);
if ($this->getResellerProperty('pstn_access')) {
printf (" PSTN
",$checked_pstn);
printf ("
Quota
",$_quota);
if ($this->prepaidChangesAllowed()) {
printf ("
Prepaid ",$checked_prepaid);
} else {
printf ("
Prepaid ");
}
}
$this->printHiddenFormElements();
print "
";
}
function addRecord($dictionary=array()) {
dprint_r($dictionary);
if ($dictionary['account']) {
$account_els = explode("@", $dictionary['account']);
$this->skipSaveProperties=true;
} else {
$account_els = explode("@", trim($_REQUEST['account']));
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
$username=$account_els[0];
if (strlen($account_els[1])) {
$domain=$account_els[1];
} else if ($dictionary['domain']) {
$domain=$dictionary['domain'];
} else if ($_REQUEST['domain']) {
$domain=trim($_REQUEST['domain']);
} else {
printf ("Error: Missing SIP domain ");
return false;
}
if (!$this->validDomain($domain)) {
print "Error: invalid domain name ";
return false;
}
if ($dictionary['fullname']) {
$name_els = explode(" ", $dictionary['fullname']);
} else {
$name_els = explode(" ", trim($_REQUEST['fullname']));
}
if (strlen($name_els[0])) {
$firstName=$name_els[0];
} else {
$firstName='Account';
}
if (strlen($name_els[1])) {
$j=1;
while ($j < count($name_els)) {
$lastName .= $name_els[$j].' ';
$j++;
}
} else {
if ($username=="") {
$lastName="Unknown";
} else {
$lastName=$username;
}
}
$lastName=trim($lastName);
if (strlen($dictionary['timezone'])) {
$timezone=$dictionary['timezone'];
} else if (strlen(trim($_REQUEST['timezone']))) {
$timezone=trim($_REQUEST['timezone']);
} else if ($this->SoapEngine->default_timezone) {
$timezone=$this->SoapEngine->default_timezone;
} else {
$timezone='Europe/Amsterdam';
}
if (!in_array($timezone,$this->timezones)) {
$timezone='Europe/Amsterdam';
}
if (strlen($dictionary['password'])) {
$password=$dictionary['password'];
} else if (strlen(trim($_REQUEST['password']))) {
$password=trim($_REQUEST['password']);
} else {
$password=$this->RandomString(10);
}
if (is_array($dictionary['groups'])) {
$groups=$dictionary['groups'];
} else {
$groups=array();
}
if (is_array($dictionary['ip_access_list'])) {
$ip_access_list=$dictionary['ip_access_list'];
} else {
$ip_access_list=array();
}
if (strlen($dictionary['call_limit'])) {
$call_limit=$dictionary['call_limit'];
} else {
$call_limit=$_REQUEST['call_limit'];
}
if($dictionary['pstn'] || $_REQUEST['pstn']) {
$_pstn=1;
$groups[]='free-pstn';
} else {
$_pstn=0;
}
if (strlen($dictionary['email'])) {
$email=$dictionary['email'];
} else {
$email=trim($_REQUEST['email']);
}
if (strlen($dictionary['rpid'])) {
$rpid=$dictionary['rpid'];
} else {
$rpid=trim($_REQUEST['rpid']);
}
if (strlen($dictionary['owner'])) {
$owner=intval($dictionary['owner']);
} else {
$owner=intval($_REQUEST['owner']);
}
if (!$owner) {
$owner = intval($customer);
}
if (strlen($dictionary['quota'])) {
$quota=intval($dictionary['quota']);
} else {
$quota=intval($_REQUEST['quota']);
}
if ($this->prepaidChangesAllowed()) {
if (strlen($dictionary['prepaid'])) {
$prepaid=intval($dictionary['prepaid']);
} else {
$prepaid=intval($_REQUEST['prepaid']);
}
} else {
$prepaid = 1;
}
if ($prepaid) {
$groups[]='prepaid';
}
if (!$email) {
if ($username=="") {
$email='unknown@'.strtolower($domain);
} else {
$email=strtolower($username).'@'.strtolower($domain);
}
}
if (!$this->skipSaveProperties) {
$_p=array(
array('name' => 'sip_accounts_last_domain',
'category' => 'web',
'value' => "$domain",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_username',
'category' => 'web',
'value' => "$username",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_timezone',
'category' => 'web',
'value' => "$timezone",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_quota',
'category' => 'web',
'value' => "$quota",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_pstn',
'category' => 'web',
'value' => "$_pstn",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_prepaid',
'category' => 'web',
'value' => "$prepaid",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
if (is_array($dictionary['properties'])) {
$properties=$dictionary['properties'];
} else {
$properties=array();
}
if ($this->SoapEngine->login_credentials['reseller']) {
$reseller_properties=$this->getResellerProperties($this->SoapEngine->login_credentials['reseller'],'store_clear_text_passwords');
if (strlen($reseller_properties['store_clear_text_passwords'])) {
$this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords'];
}
} else {
$_reseller=$this->getResellerForDomain(strtolower($domain));
if ($_reseller) {
$reseller_properties=$this->getResellerProperties($_reseller,'store_clear_text_passwords');
if (strlen($reseller_properties['store_clear_text_passwords'])) {
$this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords'];
}
}
}
if ($this->store_clear_text_passwords || $username == '') {
$password_final=$password;
} else {
$md1=strtolower($username).':'.strtolower($domain).':'.$password;
$md2=strtolower($username).'@'.strtolower($domain).':'.strtolower($domain).':'.$password;
$password_final=md5($md1).':'.md5($md2);
}
$account=array(
'id' => array('username' => strtolower($username),
'domain' => strtolower($domain)
),
'firstName' => $firstName,
'lastName' => $lastName,
'password' => $password_final,
'timezone' => $timezone,
'email' => strtolower($email),
'owner' => $owner,
'rpid' => $rpid,
'groups' => $groups,
'prepaid' => $prepaid,
'quota' => $quota,
'acl' => $ip_access_list,
'properties' => $properties
);
if (isset($call_limit)) {
$account['callLimit'] = intval($call_limit);
}
//print_r($account);
$deleteAccount=array('username' => $username,
'domain' => $domain);
if ($this->html) {
if ($username == '') {
$success_log=sprintf('SIP account has been generated in domain %s',$domain);
} else {
$success_log=sprintf('SIP account %s@%s has been added',$username,$domain);
}
}
$function=array('commit' => array('name' => 'addAccount',
'parameters' => array($account),
'logs' => array('success' => $success_log))
);
return $this->SoapEngine->execute($function,$this->html);
}
function getAllowedDomains()
{
// Filter
$filter = array(
'domain' => ''
);
// Range
$range = array(
'start' => 0,
'count' => 750
);
$orderBy = array(
'attribute' => 'domain',
'direction' => 'ASC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
"Error in getAllowedDomains from %s: %s (%s): %s ",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
//return false;
} else {
foreach ($result->domains as $_domain) {
if ($this->validDomain($_domain->domain)) {
$this->allowedDomains[] = $_domain->domain;
}
}
}
}
function showPasswordReminderForm($accounts=array()) {
printf ("
";
print _("Fill in the e-mail address used during the registration of the SIP account:
");
printf ("
";
if (count($accounts) > 1 || $_REQUEST['sip_filter']) {
printf ("
");
print _("Warning");
print " ";
print _("More than one account uses this email address. If you wish to receive the password for a particular account fill in the SIP account below, default it has been send it to the first 5 accounts found");
print "
";
printf ("
",
$_REQUEST['sip_filter']);
}
printf ("
");
}
function showPasswordReminderUpdateFormEncrypted($id, $account) {
if ($account) {
printf ("
";
print _("
Please choose new passwords for your account, if you leave them empty no change will be performed
");
print "
";
print "
";
print "";
print "
";
print _("SIP Account Password");
print " ";
print "
";
print "";
print "
";
print _("Web Password");
print " ";
print "
";
print "
");
}
}
function showPasswordReminderFormEncrypted($accounts=array()) {
printf ("
");
if(count($accounts) < 1 && $_REQUEST['sip_filter']) {
print "";
}
}
function getAccountsForPasswordReminderEncrypted($maximum_accounts=5) {
$accounts=array();
//$filter = array('email' => $this->filters['email']);
if ($_REQUEST['sip_filter']) {
list($username,$domain)=explode('@',trim($_REQUEST['sip_filter']));
if ($username && $domain) {
$filter = array('username' => $username,
'domain' => $domain,
'email' => $this->filters['email']
);
}
} else {
$filter = array('email' => $this->filters['email']);
}
$range = array('start' => 0,
'count' => $maximum_accounts);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC');
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
} else {
$i=0;
while ($i < $result->total) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$accounts[]=array('username'=> $account->id->username,
'domain' => $account->id->domain
);
$i++;
}
}
return $accounts;
}
function getAccountsForPasswordReminder($maximum_accounts=5) {
$accounts=array();
$filter = array('email' => $this->filters['email']);
if ($_REQUEST['sip_filter']) {
list($username,$domain)=explode('@',trim($_REQUEST['sip_filter']));
if ($username && $domain) {
$filter = array( 'username' => $username,
'domain' => $domain
);
}
}
$range = array('start' => 0,
'count' => $maximum_accounts);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC');
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
} else {
$i=0;
while ($i < $result->total) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$accounts[]=array('username'=> $account->id->username,
'domain' => $account->id->domain
);
$i++;
}
}
return $accounts;
}
function getResellerForDomain($domain='') {
// Filter
$filter=array(
'domain' => $domain
);
// Range
$range=array('start' => 0,
'count' => 1
);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
// Call function
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->domains[0]){
return $result->domains[0]->reseller;
} else {
return false;
}
}
}
function getResellerProperties($reseller='',$property='') {
$properties=array();
if (!$this->SoapEngine->customer_engine) {
dprint ("No customer_engine available");
return true;
}
if (!$reseller) {
dprint ("No customer provided");
return true;
}
if (!$property) {
dprint ("No property provided");
return true;
}
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers);
$result = $this->SoapEngine->soapclientCustomers->getProperties(intval($reseller));
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
}
foreach ($result as $_property) {
$properties[$_property->name]=$_property->value;
}
return $properties;
}
function pstnChangesAllowed() {
//dprint_r($this->loginProperties);
$_customer_pstn_changes=$this->getCustomerProperty('pstn_changes');
$_reseller_pstn_changes=$this->getCustomerProperty('pstn_changes');
if ($this->adminonly) {
return true;
} else if ($this->customer == $this->reseller && $_reseller_pstn_changes) {
return true;
} else if ($this->loginImpersonate == $this->reseller && $_reseller_pstn_changes) {
return true;
} else if ($_reseller_pstn_changes && $_customer_pstn_changes) {
return true;
}
return false;
}
function prepaidChangesAllowed() {
//dprint_r($this->loginProperties);
$_customer_prepaid_changes=$this->getCustomerProperty('prepaid_changes');
$_reseller_prepaid_changes=$this->getCustomerProperty('prepaid_changes');
if ($this->adminonly) {
return true;
} else if ($this->customer == $this->reseller && $_reseller_prepaid_changes) {
return true;
} else if ($this->loginImpersonate == $this->reseller && $_reseller_prepaid_changes) {
return true;
} else if ($_reseller_prepaid_changes && $_customer_prepaid_changes) {
return true;
}
return false;
}
function getTimezones () {
$this->timezones=array();
if (!$fp = fopen("timezones", "r")) {
print _("Failed to open timezone file.");
return false;
}
while ($buffer = fgets($fp,1024)) {
$this->timezones[]=trim($buffer);
}
fclose($fp);
}
function showTextBeforeCustomerSelection() {
print _("Domain owner");
}
}
class SipAliases extends Records {
var $selectionActiveExceptions=array('alias_domain');
function SipAliases($SoapEngine) {
dprint("init SipAliases");
$target_filters_els=explode("@",trim($_REQUEST['target_username_filter']));
$target_username=$target_filters_els[0];
if (count($target_filters_els) > 1) {
$target_domain=$target_filters_els[1];
}
$this->filters = array('alias_username' => strtolower(trim($_REQUEST['alias_username_filter'])),
'alias_domain' => strtolower(trim($_REQUEST['alias_domain_filter'])),
'target_username' => strtolower($target_username),
'target_domain' => strtolower($target_domain)
);
$this->Records($SoapEngine);
$this->sortElements=array(
'changeDate' => 'Change date',
'aliasUsername' => 'Alias user',
'aliasDomain' => 'Alias domain',
'targetUsername' => 'Target user',
'targetDomain' => 'Target domain',
);
}
function getRecordKeys() {
// Filter
$filter=array('aliasUsername' => $this->filters['alias_username'],
'aliasDomain' => $this->filters['alias_domain'],
'targetUsername' => $this->filters['target_username'],
'targetDomain' => $this->filters['target_domain'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'aliasUsername';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
//dprint_r($Query);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAliases');
// Call function
$result = $this->SoapEngine->soapclient->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->aliases as $alias) {
$this->selectionKeys[]=array('username' => $alias->id->username,
'domain' => $alias->id->domain);
}
return true;
}
}
function listRecords() {
$this->getAllowedDomains();
// Make sure we apply the domain filter from the login credetials
$this->showSeachForm();
// Filter
$filter=array('aliasUsername' => $this->filters['alias_username'],
'aliasDomain' => $this->filters['alias_domain'],
'targetUsername' => $this->filters['target_username'],
'targetDomain' => $this->filters['target_domain'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAliases');
// Call function
$result = $this->SoapEngine->soapclient->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id
SIP alias
Redirect target
Owner
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->aliases[$i]) break;
$alias = $result->aliases[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&alias_username_filter=%s&alias_domain_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($alias->id->username),
urlencode($alias->id->domain)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['alias_username_filter'] == $alias->id->username &&
$_REQUEST['alias_domain_filter'] == $alias->id->domain) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
/*
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($alias->customer)
);
*/
$_sip_accounts_url = $this->url.sprintf("&service=sip_accounts@%s&username_filter=%s&domain_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($alias->target->username),
urlencode($alias->target->domain)
);
if ($alias->owner) {
$_owner_url = sprintf
("%s ",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($alias->owner),
$alias->owner
);
} else {
$_owner_url='';
}
printf("
%s
%s@%s
%s@%s
%s
%s
%s
",
$index,
$alias->id->username,
$alias->id->domain,
$_sip_accounts_url,
$alias->target->username,
$alias->target->domain,
$_owner_url,
$alias->changeDate,
$_url,
$actionText
);
$i++;
}
}
print "
";
$this->showPagination($maxrows);
/*
$_properties=array(
array('name' => $this->SoapEngine->port.'_sortBy',
'value' => $this->sorting['sortBy'],
'permission' => 'customer',
'category' => 'web'
),
array('name' => $this->SoapEngine->port.'_sortOrder',
'value' => $this->sorting['sortOrder'],
'permission' => 'customer',
'category' => 'web'
)
);
print_r($_properties);
$this->setCustomerProperties($_properties);
*/
return true;
}
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['alias_username']) {
$alias_username=$dictionary['alias_username'];
} else {
$alias_username=$this->filters['alias_username'];
}
if ($dictionary['alias_domain']) {
$alias_domain=$dictionary['alias_domain'];
} else {
$alias_domain=$this->filters['alias_domain'];
}
if (!strlen($alias_username) || !strlen($alias_domain)) {
print "
Error: missing SIP alias username or domain. ";
return false;
}
$alias=array('username' => $alias_username,
'domain' => $alias_domain
);
$function=array('commit' => array('name' => 'deleteAlias',
'parameters' => array($alias),
'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$this->filters['alias_username'],$this->filters['alias_domain'])
)
)
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf ("
SIP alias
",$this->filters['alias_username']);
printf ("@");
if (count($this->allowedDomains) > 0) {
if ($this->filters['alias_domain'] && !in_array($this->filters['alias_domain'],$this->allowedDomains)) {
printf ("
",$this->filters['alias_domain']);
} else {
$selected_domain[$this->filters['alias_domain']]='selected';
printf ("
");
foreach ($this->allowedDomains as $_domain) {
printf (" $_domain",$selected_domain[$_domain]);
}
printf (" ");
}
} else {
printf ("
",$this->filters['alias_domain']);
}
printf ("
Redirect target
",trim($_REQUEST['target_username_filter']));
printf ("
Owner
",$this->filters['owner']);
}
function showAddForm() {
if ($this->selectionActive) return;
if (!count($this->allowedDomains)) {
print "
You must create at least one SIP domain before adding SIP aliases ";
return false;
}
printf ("
",$_SERVER['PHP_SELF']);
print "
";
}
function addRecord($dictionary=array()) {
if ($dictionary['alias']) {
$alias_els = explode("@", $dictionary['alias']);
$this->skipSaveProperties=true;
} else {
$alias_els = explode("@", trim($_REQUEST['alias']));
}
if ($dictionary['target']) {
$target_els = explode("@", $dictionary['target']);
} else {
$target_els = explode("@", trim($_REQUEST['target']));
}
if ($dictionary['owner']) {
$owner = $dictionary['owner'];
} else {
$owner = $_REQUEST['owner'];
}
if (preg_match("/:(.*)$/",$target_els[0],$m)) {
$target_username=$m[1];
} else {
$target_username=$target_els[0];
}
if (preg_match("/:(.*)$/",$alias_els[0],$m)) {
$username=$m[1];
} else {
$username=$alias_els[0];
}
if (strlen($alias_els[1])) {
$domain=$alias_els[1];
} else if (trim($_REQUEST['domain'])) {
$domain=trim($_REQUEST['domain']);
} else {
if ($this->html) {
printf ("
Error: Missing SIP domain ");
}
return false;
}
if (!$this->validDomain($domain)) {
if ($this->html) {
print "Error: invalid domain name ";
}
return false;
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!$this->skipSaveProperties=true) {
$_p=array(
array('name' => 'sip_aliases_last_domain',
'category' => 'web',
'value' => strtolower($domain),
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$alias=array(
'id' => array('username' => strtolower($username),
'domain' => strtolower($domain)
),
'target' => array('username' => strtolower($target_username),
'domain' => strtolower($target_els[1])
),
'owner' => intval($owner)
);
$deleteAlias=array('username' => strtolower($username),
'domain' => strtolower($domain)
);
$function=array('commit' => array('name' => 'addAlias',
'parameters' => array($alias),
'logs' => array('success' => sprintf('SIP alias %s@%s has been added',$username,$domain)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function getAllowedDomains() {
// Filter
$filter=array(
'domain' => ''
);
// Range
$range=array('start' => 0,
'count' => 500
);
$orderBy = array('attribute' => 'domain',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->domains as $_domain) {
if ($this->validDomain($_domain->domain)) {
$this->allowedDomains[]=$_domain->domain;
}
}
}
}
function showTextBeforeCustomerSelection() {
print _("Domain owner");
}
}
class EnumRanges extends Records {
var $selectionActiveExceptions=array('tld');
var $record_generator='';
// only admin can add prefixes below
var $deniedPrefixes=array('1','20','210','211','212','213','214','215','216','217','218','219','220','221','222','223','224','225','226','227','228','229','230','231','232','233','234','235','236','237','238','239','240','241','242','243','244','245','246','247','248','249','250','251','252','253','254','255','256','257','258','259','260','261','262','263','264','265','266','267','268','269','27','280','281','282','283','284','285','286','287','288','289','290','291','292','293','294','295','296','297','298','299','30','31','32','33','34','350','351','352','353','354','355','356','357','358','359','36','370','371','372','373','374','375','376','377','378','379','380','381','382','383','384','385','386','387','388','389','39','40','41','420','421','422','423','424','425','426','427','428','429','43','44','45','46','47','48','49','500','501','502','503','504','505','506','507','508','509','51','52','53','54','55','56','57','58','590','591','592','593','594','595','596','597','598','599','60','61','62','63','64','65','66','670','671','672','673','674','675','676','677','678','679','680','681','682','683','684','685','686','687','688','689','690','691','692','693','694','695','696','697','698','699','7','800','801','802','803','804','805','806','807','808','809','81','82','830','831','832','833','834','835','836','837','838','839','84','850','851','852','853','854','855','856','857','858','859','86','870','871','872','873','874','875','876','877','878','879','880','881','882','883','884','885','886','887','888','889','890','891','892','893','894','895','896','897','898','899','90','91','92','93','94','95','960','961','962','963','964','965','966','967','968','969','970','971','972','973','974','975','976','977','978','979','98','990','991','992','993','994','995','996','997','998','999');
var $FieldsAdminOnly=array(
'reseller' => array('type'=>'integer',
'help' => 'Range owner')
);
var $Fields=array(
'customer' => array('type'=>'integer',
'help' => 'Range owner'
),
'serial' => array('type'=>'integer',
'help'=>'DNS serial number',
'readonly' => 1
),
'ttl' => array('type'=>'integer',
'help'=>'Cache period in DNS clients'
),
'info' => array('type'=>'string',
'help' =>'Range description'
),
'size' => array('type'=>'integer',
'help'=>'Maximum number of telephone numbers'
),
'minDigits' => array('type'=>'integer',
'help'=>'Minimum number of digits for telephone numbers'
),
'maxDigits' => array('type'=>'integer',
'help'=>'Maximum number of digits for telephone numbers'
)
);
function EnumRanges($SoapEngine) {
dprint("init EnumRanges");
$this->filters = array('prefix' => trim(ltrim($_REQUEST['prefix_filter']),'+'),
'tld' => trim($_REQUEST['tld_filter']),
'info' => trim($_REQUEST['info_filter'])
);
$this->Records($SoapEngine);
$this->sortElements=array('changeDate' => 'Change date',
'prefix' => 'Prefix',
'tld' => 'TLD'
);
/*
$this->Fields['nameservers'] = array('type'=>'text',
'name'=>'Name servers',
'help'=>'Name servers authoritative for this DNS zone'
);
*/
if ($this->login_credentials['reseller_filters'][$this->reseller]['record_generator']) {
//printf ("Engine: %s",$this->SoapEngine->soapEngine);
if (is_array($this->login_credentials['reseller_filters'][$this->reseller]['record_generator'])) {
$_rg=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator'];
if ($_rg[$this->SoapEngine->soapEngine]) {
$this->record_generator=$_rg[$this->SoapEngine->soapEngine];
}
} else {
$this->record_generator=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator'];
}
} else if (strlen($this->SoapEngine->record_generator)) {
$this->record_generator=$this->SoapEngine->record_generator;
}
}
function listRecords() {
$this->getAllowedDomains();
$this->showSeachForm();
// Filter
$filter=array('prefix' => $this->filters['prefix'],
'tld' => $this->filters['tld'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id
Owner
Prefix
TLD
Serial
TTL
Info
Min
Max
Size
Used
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->ranges[$i]) break;
$range = $result->ranges[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&prefix_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($range->id->prefix),
urlencode($range->id->tld)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$range->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['prefix_filter'] == $range->id->prefix &&
$_REQUEST['tld_filter'] == $range->id->tld) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
if ($this->adminonly) {
$range_url=sprintf('%s ',$this->url,$this->SoapEngine->service,$range->reseller,$range->id->prefix,$range->id->tld,$range->id->prefix);
} else {
$range_url=sprintf('%s ',$this->url,$this->SoapEngine->service,$range->id->prefix,$range->id->tld,$range->id->prefix);
}
if ($this->record_generator) {
$generator_url=sprintf('+Numbers ',$this->url,$this->record_generator,$range->id->prefix,$range->id->tld,$range->maxDigits,$range->reseller);
} else {
$generator_url='';
}
if ($range->size) {
$usage=intval(100*$range->used/$range->size);
$bar=$this->makebar($usage);
} else {
$bar="";
}
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($range->customer)
);
$_nameservers='';
foreach ($range->nameservers as $_ns) {
$_nameservers.= $_ns.' ';
}
printf("
%s
%s.%s
+%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s %s
",
$index,
$_customer_url,
$range->customer,
$range->reseller,
$range_url,
$range->id->tld,
$range->serial,
$range->ttl,
$range->info,
$range->minDigits,
$range->maxDigits,
$range->size,
$range->used,
$bar,
$range->changeDate,
$_url,
$actionText,
$generator_url
);
$i++;
}
}
print "
";
if ($this->rows == 1) {
$this->showRecord($range);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['prefix']) || !strlen($this->filters['tld'])) {
print "
Error: missing ENUM range id ";
return false;
}
$rangeId=array('prefix'=>$this->filters['prefix'],
'tld'=>$this->filters['tld']);
$function=array('commit' => array('name' => 'deleteRange',
'parameters' => array($rangeId),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been deleted',$this->filters['prefix'],$this->filters['tld'])
)
)
);
unset($this->filters);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showAddForm() {
if ($this->selectionActive) return;
printf ("
",$_SERVER['PHP_SELF']);
print "
";
print "
";
$this->showCustomerTextBox();
printf ("
Prefix +
",$_REQUEST['prefix']);
printf (" TLD ");
if ($_REQUEST['tld']) {
printf ("
",$_REQUEST['tld']);
} else if ($this->filters['tld']) {
printf (" ",$this->filters['tld']);
} else if ($_tld=$this->getCustomerProperty('enum_ranges_last_tld')) {
printf ("
",$_tld);
} else {
printf ("
");
}
printf ("
TTL
");
printf ("
Min Digits
");
printf ("
Max Digits
");
printf ("
Info
",$_REQUEST['info']);
$this->printHiddenFormElements();
print "
";
}
function addRecord($dictionary=array()) {
$tld = trim($_REQUEST['tld']);
$prefix = trim($_REQUEST['prefix']);
$size = trim($_REQUEST['size']);
$info = trim($_REQUEST['info']);
if (!strlen($tld)) {
$tld=$this->SoapEngine->default_enum_tld;
}
if (!strlen($tld) || !strlen($prefix) || !is_numeric($prefix)) {
printf ("
Error: Missing TLD or prefix. ");
return false;
}
if (!$this->adminonly) {
if (in_array($prefix,$this->deniedPrefixes)) {
print "
Error: Only an administrator account can create the prefix coresponding to a country code. ";
return false;
}
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!trim($_REQUEST['ttl'])) {
$ttl = 3600;
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
$range = array(
'id' => array(
'prefix' => $prefix,
'tld' => $tld
),
'ttl' => $ttl,
'info' => $info,
'minDigits' => intval(trim($_REQUEST['minDigits'])),
'maxDigits' => intval(trim($_REQUEST['maxDigits'])),
'size' => intval($size),
'customer' => intval($customer),
'reseller' => intval($reseller)
);
$deleteRange = array(
'prefix'=>$prefix,
'tld'=>$tld
);
$_p = array(
array(
'name' => 'enum_ranges_last_tld',
'category' => 'web',
'value' => "$tld",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
$function = array(
'commit' => array(
'name' => 'addRange',
'parameters' => array($range),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been added',$prefix,$tld))
)
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showSeachFormCustom() {
printf ("
Prefix
",$this->filters['prefix']);
printf ("
TLD ");
if (count($this->allowedDomains) > 0) {
$selected_tld[$this->filters['tld']]='selected';
printf ("
");
foreach ($this->allowedDomains as $_tld) {
printf (" %s",$_tld,$selected_tld[$_tld],$_tld);
}
printf ("
");
} else {
printf ("
",$this->filters['tld']);
}
printf ("
Info
",$this->filters['info']);
}
function getAllowedDomains() {
// Filter
$filter=array('prefix' => '');
// Range
$range=array('start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach($result->ranges as $range) {
$this->ranges[]=array('prefix' => $range->id->prefix,
'tld' => $range->id->tld,
'minDigits' => $range->minDigits,
'maxDigits' => $range->maxDigits
);
if (in_array($range->id->tld,$this->allowedDomains)) continue;
$this->allowedDomains[]=$range->id->tld;
$seen[$range->id->tld]++;
}
if (!$seen[$this->SoapEngine->default_enum_tld]) {
$this->allowedDomains[]=$this->SoapEngine->default_enum_tld;
}
}
}
function showRecord($range) {
print "
";
print "
";
printf ("",$_SERVER['PHP_SELF']);
print " ";
print "
";
printf ("DNS zone %s ",
$this->tel2enum($range->id->prefix,$range->id->tld));
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
if ($item == 'nameservers') {
foreach ($range->$item as $_item) {
$nameservers.=$_item."\n";
}
$item_value=$nameservers;
} else {
$item_value=$range->$item;
}
if ($this->FieldsAdminOnly[$item]['name']) {
$item_name=$this->FieldsAdminOnly[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($this->FieldsAdminOnly[$item]['type'] == 'text') {
printf ("
%s
%s
%s
",
$item_name,
$item,
$item_value,
$this->FieldsAdminOnly[$item]['help']
);
} else {
printf ("
%s
%s
",
$item_name,
$item,
$item_value,
$this->FieldsAdminOnly[$item]['help']
);
}
}
}
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($item == 'nameservers') {
foreach ($range->$item as $_item) {
$nameservers.=$_item."\n";
}
$item_value=$nameservers;
} else {
$item_value=$range->$item;
}
if ($this->Fields[$item]['type'] == 'text') {
printf ("
%s
%s
%s
",
$item_name,
$item,
$item_value,
$this->Fields[$item]['help']
);
}else if ($this->Fields[$item]['readonly']) {
printf ("
%s
%s
%s
",
$item_name,
$item_value,
$this->Fields[$item]['help']
);
} else {
printf ("
%s
%s
",
$item_name,
$item,
$item_value,
$this->Fields[$item]['help']
);
}
}
printf (" ",$range->id->tld);
printf (" ",$range->id->prefix);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print " ";
print "
";
}
function updateRecord () {
//print "Updating range ...";
if (!$_REQUEST['prefix_filter'] || !$_REQUEST['tld_filter']) return;
$rangeid=array('prefix' => $_REQUEST['prefix_filter'],
'tld' => $_REQUEST['tld_filter']
);
if (!$range = $this->getRecord($rangeid)) {
return false;
}
$range_old=$range;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$range->$item = intval($_REQUEST[$var_name]);
} else if ($item == 'nameservers') {
$_txt=trim($_REQUEST[$var_name]);
if (!strlen($_txt)) {
unset($range->$item);
} else {
$_nameservers=array();
$_lines=explode("\n",$_txt);
foreach ($_lines as $_line) {
$_ns=trim($_line);
$_nameservers[]=$_ns;
}
$range->$item=$_nameservers;
}
} else {
$range->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name=$item.'_form';
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$range->$item = intval($_REQUEST[$var_name]);
} else {
$range->$item = trim($_REQUEST[$var_name]);
}
}
}
$function=array('commit' => array('name' => 'updateRange',
'parameters' => array($range),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been updated',$rangeid['prefix'],$rangeid['tld'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function getRecord($rangeid) {
// Filter
if (!$rangeid['prefix'] || !$rangeid['tld']) {
print "Error in getRecord(): Missing prefix or tld";
return false;
}
$filter=array('prefix' => $rangeid['prefix'],
'tld' => $rangeid['tld']
);
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->ranges[0]){
return $result->ranges[0];
} else {
return false;
}
}
}
}
class EnumMappings extends Records {
var $default_ttl = 3600;
var $default_priority = 5;
var $sortElements=array('changeDate' => 'Change date',
'number' => 'Number',
'tld' => 'TLD'
);
var $ranges=array();
var $FieldsReadOnly=array(
'customer',
'reseller'
);
var $Fields=array(
'owner' => array('type'=>'integer'),
'info' => array('type'=>'string')
);
var $mapping_fields=array('id' => 'integer',
'type' => 'string',
'mapto' => 'string',
'priority' => 'integer',
'ttl' => 'integer'
);
var $NAPTR_services=array(
"sip" => array("service"=>"sip",
"webname"=>"SIP",
"schemas"=>array("sip:","sips:")),
"mailto" => array("service"=>"mailto",
"webname"=>"Email",
"schemas"=>array("mailto:")),
"web:http" => array("service"=>"web:http",
"webname"=>"WEB (http)",
"schemas"=>array("http://")),
"web:https" => array("service"=>"web:https",
"webname"=>"WEB (https)",
"schemas"=>array("https://")),
"x-skype:callto" => array("service"=>"x-skype:callto",
"webname"=>"Skype",
"schemas"=>array("callto:")),
"h323" => array("service"=>"h323",
"webname"=>"H323",
"schemas"=>array("h323:")),
"iax" => array("service"=>"iax",
"webname"=>"IAX",
"schemas"=>array("iax:")),
"iax2" => array("service"=>"iax2",
"webname"=>"IAX2",
"schemas"=>array("iax2:")),
"mms" => array("service"=>"mms",
"webname"=>"MMS",
"schemas"=>array("tel:","mailto:")),
"sms" => array("service"=>"sms",
"webname"=>"SMS",
"schemas"=>array("tel:","mailto:")),
"ems" => array("service"=>"ems",
"webname"=>"EMS",
"schemas"=>array("tel:","mailto:")),
"im" => array("service"=>"im",
"webname"=>"IM",
"schemas"=>array("im:")),
"npd:tel" => array("service"=>"npd+tel",
"webname"=>"Portability",
"schemas"=>array("tel:")),
"void:mailto" => array("service"=>"void:mailto",
"webname"=>"VOID(mail)",
"schemas"=>array("mailto:")),
"void:http" => array("service"=>"void:http",
"webname"=>"VOID(http)",
"schemas"=>array("http://")),
"void:https" => array("service"=>"void:https",
"webname"=>"VOID(https)",
"schemas"=>array("https://")),
"voice" => array("service"=>"voice",
"webname"=>"Voice",
"schemas"=>array("voice:","tel:")),
"tel" => array("service"=>"tel",
"webname"=>"Tel",
"schemas"=>array("tel:")),
"fax:tel" => array("service"=>"fax:tel",
"webname"=>"Fax",
"schemas"=>array("tel:")),
"ifax:mailto" => array("service"=>"ifax:mailto",
"webname"=>"iFax",
"schemas"=>array("mailto:")),
"pres" => array("service"=>"pres",
"webname"=>"Presence",
"schemas"=>array("pres:")),
"ft:ftp" => array("service"=>"ft:ftp",
"webname"=>"FTP",
"schemas"=>array("ftp://")),
"loc:http" => array("service"=>"loc:http",
"webname"=>"GeoLocation",
"schemas"=>array("http://")),
"key:http" => array("service"=>"key:http",
"webname"=>"Public key",
"schemas"=>array("http://")),
"key:https" => array("service"=>"key:https",
"webname"=>"Public key (HTTPS)",
"schemas"=>array("https://"))
);
function EnumMappings($SoapEngine) {
dprint("init EnumMappings");
if ($_REQUEST['range_filter']) {
list($_prefix,$_tld_filter)= explode("@",$_REQUEST['range_filter']);
if ($_prefix && !$_REQUEST['number_filter']) {
$_number_filter=$_prefix.'%';
} else {
$_number_filter=$_REQUEST['number_filter'];
}
} else {
$_number_filter=$_REQUEST['number_filter'];
$_tld_filter=trim($_REQUEST['tld_filter']);
}
$_number_filter=ltrim($_number_filter,'+');
$this->filters = array('number' => ltrim($_number_filter,'+'),
'tld' => $_tld_filter,
'range' => trim($_REQUEST['range_filter']),
'type' => trim($_REQUEST['type_filter']),
'mapto' => trim($_REQUEST['mapto_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
$this->Records($SoapEngine);
$this->getAllowedDomains();
}
function listRecords() {
$this->showSeachForm();
$filter=array('number' => $this->filters['number'],
'tld' => $this->filters['tld'],
'type' => $this->filters['type'],
'mapto' => $this->filters['mapto'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumbers');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Range Owner
Phone number
TLD
Info
Owner
Type
Id
Map to
TTL
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->numbers[$i]) break;
$number = $result->numbers[$i];
$index=$this->next+$i+1;
$j=1;
foreach ($number->mappings as $_mapping) {
unset($sip_engine);
foreach (array_keys($this->login_credentials['reseller_filters']) as $_res) {
if ($_res == $number->reseller) {
if ($this->login_credentials['reseller_filters'][$_res]['sip_engine']) {
$sip_engine=$this->login_credentials['reseller_filters'][$_res]['sip_engine'];
break;
}
}
}
if (!$sip_engine) {
if ($this->login_credentials['reseller_filters']['default']['sip_engine']) {
$sip_engine=$this->login_credentials['reseller_filters']['default']['sip_engine'];
} else {
$sip_engine=$this->SoapEngine->sip_engine;
}
}
if (preg_match("/^sip:(.*)$/",$_mapping->mapto,$m) && $this->sip_settings_page) {
$url=sprintf('%s?account=%s&reseller=%s&sip_engine=%s',
$this->sip_settings_page,urlencode($m[1]), $number->reseller,$sip_engine);
if ($this->adminonly) $url .= sprintf('&adminonly=%s',$this->adminonly);
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
$url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element]));
}
$mapto=sprintf("
sip:%s ",$url,$m[1]);
} else {
$mapto=sprintf("%s",$_mapping->mapto);
}
$_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s&mapto_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld),
urlencode($_mapping->mapto)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['number_filter'] == $number->id->number &&
$_REQUEST['tld_filter'] == $number->id->tld &&
$_REQUEST['mapto_filter'] == $_mapping->mapto) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
if ($j==1) {
$_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld)
);
if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($number->customer)
);
if ($number->owner) {
$_owner_url = sprintf
("%s ",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($number->owner),
$number->owner
);
} else {
$_owner_url='';
}
printf("
%s
%s.%s
+%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$number->customer,
$number->reseller,
$_number_url,
$number->id->number,
$number->id->tld,
$number->info,
$_owner_url,
ucfirst($_mapping->type),
$_mapping->id,
$mapto,
$_mapping->ttl,
$number->changeDate,
$_url,
$actionText
);
} else {
printf("
%s
%s
%s
%s
%s
%s
",
ucfirst($_mapping->type),
$_mapping->id,
$mapto,
$_mapping->ttl,
$number->changeDate,
$_url,
$actionText
);
}
$j++;
}
if (!is_array($number->mappings) || !count($number->mappings)) {
$_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld),
urlencode($_mapping->mapto)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['number_filter'] == $number->id->number &&
$_REQUEST['tld_filter'] == $number->id->tld &&
$_REQUEST['mapto_filter'] == $_mapping->mapto) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld)
);
if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($number->customer)
);
if ($number->owner) {
$_owner_url = sprintf
("%s ",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($number->owner),
$number->owner
);
} else {
$_owner_url='';
}
printf("
%s
%s.%s
+%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$number->customer,
$number->reseller,
$_number_url,
$number->id->number,
$number->id->tld,
$number->info,
$_owner_url,
$number->changeDate,
$_url,
$actionText
);
}
printf("
");
$i++;
}
}
print "
";
if ($this->rows == 1 ) {
$this->showRecord($number);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function getLastNumber() {
// Filter
$filter=array('number' => ''
);
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumbers');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->total) {
$number = array('number' => $result->numbers[0]->id->number,
'tld' => $result->numbers[0]->id->tld,
'mappings' => $result->numbers[0]->mappings
);
return $number;
}
}
return false;
}
function showSeachFormCustom() {
/*
print " ";
$selected_range[$_REQUEST['range_filter']]='selected';
foreach ($this->ranges as $_range) {
$rangeId=$_range['prefix'].'@'.$_range['tld'];
printf (" %s +%s",$rangeId,$selected_range[$rangeId],$_range['tld'],$_range['prefix']);
}
print " ";
*/
printf (" Number
",$_REQUEST['number_filter']);
printf (" Map to ");
print "
";
reset($this->NAPTR_services);
$selected_naptr_service[$this->filters['type']]='selected';
while (list($k,$v) = each($this->NAPTR_services)) {
printf (" %s",$k,$selected_naptr_service[$k],$this->NAPTR_services[$k]['webname']);
}
print "
";
printf ("
",$this->filters['mapto']);
printf (" Owner
",$this->filters['owner']);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['number']) {
$number=$dictionary['number'];
} else {
$number=$this->filters['number'];
}
if ($dictionary['tld']) {
$tld=$dictionary['tld'];
} else {
$tld=$this->filters['tld'];
}
if ($dictionary['mapto']) {
$mapto=$dictionary['mapto'];
} else {
$mapto=$this->filters['mapto'];
}
if (!strlen($number) || !strlen($tld)) {
print "
Error: missing ENUM number or TLD ";
return false;
}
$enum_id=array('number' => $number,
'tld' => $tld
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enum_id);
if (!(new PEAR)->isError($result)) {
// the number exists and we make an update
$result_new=$result;
if (count($result->mappings) > 1) {
foreach ($result->mappings as $_mapping) {
if ($_mapping->mapto != $mapto) {
$mappings_new[]=array('type' => $_mapping->type,
'mapto' => $_mapping->mapto,
'ttl' => $_mapping->ttl,
'priority' => $_mapping->priority,
'id' => $_mapping->id
);
}
}
if (!is_array($mappings_new)) $mappings_new = array();
$result_new->mappings=$mappings_new;
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($result_new),
'logs' => array('success' => sprintf('ENUM mapping %s has been deleted',$mapto)))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
} else {
$function=array('commit' => array('name' => 'deleteNumber',
'parameters' => array($enum_id),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$number,$tld))),
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
unset($this->filters);
} else {
return false;
}
}
function showAddForm() {
if ($this->selectionActive) return;
//if ($this->adminonly && !$this->filters['reseller']) return;
if (!count($this->ranges)) {
//print "
You must create at least one ENUM range before adding ENUM numbers ";
return false;
}
printf ("
",$_SERVER['PHP_SELF']);
print "
";
if ($this->adminonly) {
printf ("
",$this->filters['reseller']);
}
print "
";
printf (" Number");
print " ";
if ($_REQUEST['range']) {
$selected_range[$_REQUEST['range']]='selected';
} else if ($_range=$this->getCustomerProperty('enum_numbers_last_range')) {
$selected_range[$_range]='selected';
}
foreach ($this->ranges as $_range) {
$rangeId=$_range['prefix'].'@'.$_range['tld'];
printf ("+%s (%s)",$rangeId,$selected_range[$rangeId],$_range['prefix'],$_range['tld']);
}
print " ";
if ($_REQUEST['number']) {
printf (" ",$_REQUEST['number']);
} else if ($_number=$this->getCustomerProperty('enum_numbers_last_number')) {
$_prefix=$_range['prefix'];
preg_match("/^$_prefix(.*)/",$_number,$m);
printf (" ",$m[1]);
} else {
printf (" ");
}
print "
";
printf ("Map to");
print " ";
if ($_REQUEST['type']) {
$selected_naptr_service[$_REQUEST['type']]='selected';
} else if ($_type=$this->getCustomerProperty('enum_numbers_last_type')) {
$selected_naptr_service[$_type]='selected';
}
reset($this->NAPTR_services);
while (list($k,$v) = each($this->NAPTR_services)) {
printf ("%s",$k,$selected_naptr_service[$k],$this->NAPTR_services[$k]['webname']);
}
print "
";
if ($_REQUEST['type']) {
$selected_naptr_service[$_REQUEST['type']]='selected';
} else if ($_type=$this->getCustomerProperty('enum_numbers_last_type')) {
$selected_naptr_service[$_type]='selected';
}
printf (" ",$_REQUEST['mapto']);
print "
";
print "TTL";
print " ";
if ($_REQUEST['ttl']) {
printf ("
",$_REQUEST['ttl']);
} else if ($_ttl=$this->getCustomerProperty('enum_numbers_last_ttl')) {
printf ("
",$_ttl);
} else {
printf (" ");
}
printf (" Owner
",$_REQUEST['owner']);
printf (" Info
",$_REQUEST['info']);
$this->printHiddenFormElements();
print "
";
}
function getAllowedDomains() {
// Filter
$filter=array('prefix' => '',
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 200
);
// Order
$orderBy = array('attribute' => 'prefix',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach($result->ranges as $range) {
$this->ranges[]=array('prefix' => $range->id->prefix,
'tld' => $range->id->tld,
'minDigits' => $range->minDigits,
'maxDigits' => $range->maxDigits
);
if (in_array($range->id->tld,$this->allowedDomains)) continue;
$this->allowedDomains[]=$range->id->tld;
$seen[$range->id->tld]++;
}
if (!$seen[$this->SoapEngine->default_enum_tld]) {
$this->allowedDomains[]=$this->SoapEngine->default_enum_tld;
}
}
}
function addRecord($dictionary=array()) {
$prefix='';
if ($dictionary['range']) {
list($prefix,$tld)=explode('@',trim($dictionary['range']));
$this->skipSaveProperties=true;
} else if ($dictionary['tld']) {
$tld = $dictionary['tld'];
} else if ($_REQUEST['range']) {
list($prefix,$tld)=explode('@',trim($_REQUEST['range']));
} else {
$tld = trim($_REQUEST['tld']);
}
if ($dictionary['number']) {
$number = $dictionary['number'];
} else {
$number = trim($_REQUEST['number']);
}
$number=$prefix.$number;
if (!strlen($tld)) {
$tld=$this->SoapEngine->default_enum_tld;
}
if (!strlen($tld) || !strlen($number) || !is_numeric($number)) {
printf ("Error: Missing TLD or number. ");
return false;
}
if ($dictionary['ttl']) {
$ttl = intval($dictionary['ttl']);
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if (!$ttl) $ttl=3600;
if ($dictionary['priority']) {
$priority = intval($dictionary['priority']);
} else {
$priority = intval(trim($_REQUEST['priority']));
}
if ($dictionary['owner']) {
$owner = intval($dictionary['owner']);
} else {
$owner = intval(trim($_REQUEST['owner']));
}
if ($dictionary['info']) {
$info = $dictionary['info'];
} else {
$info = trim($_REQUEST['info']);
}
if (!$priority) $priority=5;
$enum_id=array('number' => $number,
'tld' => $tld);
if ($dictionary['mapto']) {
$mapto = $dictionary['mapto'];
} else {
$mapto = trim($_REQUEST['mapto']);
}
if ($dictionary['type']) {
$type = $dictionary['type'];
} else {
$type = trim($_REQUEST['type']);
}
if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else {
$_scheme = '';
$_value = $mapto;
}
if (!$_value) {
$lastNumber=$this->getLastNumber();
foreach($lastNumber['mappings'] as $_mapping) {
if ($_mapping->type == trim($type)) {
if (preg_match("/^(.*)@(.*)$/",$_mapping->mapto,$m)) {
$_value = $number.'@'.$m[2];
break;
}
}
}
}
if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) {
$_scheme=$this->NAPTR_services[trim($type)]['schemas'][0];
}
$mapto=$_scheme.$_value;
$enum_number=array('id' => $enum_id,
'owner' => $owner,
'info' => $info,
'mappings' => array(array('type' => $type,
'mapto' => $mapto,
'ttl' => $ttl,
'priority' => $priority
)
)
);
if (!$this->skipSaveProperties=true) {
$_p=array(
array('name' => 'enum_numbers_last_range',
'category' => 'web',
'value' => $_REQUEST['range'],
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_type',
'category' => 'web',
'value' => "$type",
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_number',
'category' => 'web',
'value' => "$number",
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_ttl',
'category' => 'web',
'value' => "$ttl",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($result)) {
$error_msg=$result->getMessage();
$error_fault=$result->getFault();
$error_code=$result->getCode();
if ($error_fault->detail->exception->errorcode == "3002") {
$function=array('commit' => array('name' => 'addNumber',
'parameters' => array($enum_number),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been added',$number,$tld)))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
}
} else {
// the number exists and we make an update
$result_new=$result;
foreach ($result->mappings as $_mapping) {
$mappings_new[]=array('type' => $_mapping->type,
'mapto' => $_mapping->mapto,
'ttl' => $_mapping->ttl,
'priority' => $_mapping->priority,
'id' => $_mapping->id
);
if ($_mapping->mapto == $mapto) {
printf ("
Info: ENUM mapping %s for number %s already exists ",$mapto,$number);
return $result;
}
}
$mappings_new[]=array('type' => trim($type),
'mapto' => $mapto,
'ttl' => intval(trim($_REQUEST['ttl'])),
'priority'=> intval(trim($_REQUEST['priority'])),
);
// add mapping
$result_new->mappings=$mappings_new;
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($result_new),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$number,$tld)))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
}
function getRecordKeys() {
// Filter
$filter=array('number' => $this->filters['number'],
'tld' => $this->filters['tld'],
'type' => $this->filters['type'],
'mapto' => $this->filters['mapto'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 1000
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumberss');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->numbers as $number) {
$this->selectionKeys[]=array('number' => $number->id->number,
'tld' => $number->id->tld);
}
return true;
}
}
function showRecord($number) {
print "
";
print "";
print "";
print "Number ";
print " ";
print "Mappings ";
print " ";
print " ";
print "";
print "";
print "";
printf ("",$_SERVER['PHP_SELF']);
print " ";
printf ("DNS name %s ",
$this->tel2enum($number->id->number,$number->id->tld));
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($this->Fields[$item]['type'] == 'text') {
printf ("
%s
%s
",
$item_name,
$item,
$number->$item
);
} else {
printf ("
%s
",
$item_name,
$item,
$number->$item
);
}
}
printf (" ",$number->id->tld);
printf (" ",$number->id->number);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print "
";
print " ";
print "";
print "";
print " ";
print "Id ";
print "Type ";
print "Map to ";
print "TTL ";
print " ";
foreach ($number->mappings as $_mapping) {
$j++;
unset($selected_type);
print "";
print "$j ";
printf ("%d ",$_mapping->id,$_mapping->id);
$selected_type[$_mapping->type]='selected';
printf ("
");
reset($this->NAPTR_services);
while (list($k,$v) = each($this->NAPTR_services)) {
printf ("%s",$k,$selected_type[$k],$this->NAPTR_services[$k]['webname']);
}
print "
";
printf ("
",
$_mapping->mapto,
$_mapping->ttl
);
print " ";
}
$j++;
print "";
print " ";
print " ";
printf ("
");
reset($this->NAPTR_services);
while (list($k,$v) = each($this->NAPTR_services)) {
printf ("%s",$k,$this->NAPTR_services[$k]['webname']);
}
print "
";
printf ("
"
);
print " ";
print "
";
print " ";
print " ";
print "
";
print "";
print "
";
}
function getRecord($enumid) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enumid);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return $result;
}
}
function updateRecord () {
//print "Updating number ...";
if (!$_REQUEST['number_filter'] || !$_REQUEST['tld_filter']) return;
$enumid=array('number' => $_REQUEST['number_filter'],
'tld' => $_REQUEST['tld_filter']
);
if (!$number = $this->getRecord($enumid)) {
return false;
}
$number_old=$number;
$new_mappings=array();
/*
foreach ($number->mappings as $_mapping) {
foreach (array_keys($this->mapping_fields) as $field) {
if ($this->mapping_fields[$field] == 'integer') {
$new_mapping[$field]=intval($_mapping->$field);
} else {
$new_mapping[$field]=$_mapping->$field;
}
}
$new_mappings[]=$new_mapping;
}
*/
$j=0;
while ($j< count($_REQUEST['mapping_type'])) {
$mapto = $_REQUEST['mapping_mapto'][$j];
$type = $_REQUEST['mapping_type'][$j];
$id = $_REQUEST['mapping_id'][$j];
$ttl = intval($_REQUEST['mapping_ttl'][$j]);
$priority = intval($_REQUEST['mapping_priority'][$j]);
if (!$ttl) $ttl = $this->default_ttl;
if (!$priority) $priority = $this->default_priority;
if (strlen($mapto)) {
if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else {
$_scheme = '';
$_value = $mapto;
}
reset($this->NAPTR_services);
if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) {
$_scheme=$this->NAPTR_services[trim($type)]['schemas'][0];
}
$mapto=$_scheme.$_value;
$new_mappings[]=array( 'type' => $type,
'ttl' => $ttl,
'id' => intval($id),
'mapto' => $mapto,
'priority' => $priority
);
}
$j++;
}
$number->mappings=$new_mappings;
if (!is_array($number->mappings)) $number->mappings=array();
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$number->$item = intval($_REQUEST[$var_name]);
} else {
$number->$item = trim($_REQUEST[$var_name]);
}
}
//print_r($number);
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$enumid['number'],$enumid['tld'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result) ;
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showTextBeforeCustomerSelection() {
print _("Range owner");
}
}
class DnsZones extends Records {
var $FieldsAdminOnly=array(
'reseller' => array('type'=>'integer',
'help' => 'Zone owner')
);
var $Fields=array(
'customer' => array('type'=>'integer',
'help' => 'Zone owner'
),
'serial' => array('type'=>'integer',
'help'=>'Serial number',
'readonly' => 1
),
'email' => array('type'=>'string',
'help'=>'Administrator address'
),
'ttl' => array('type'=>'integer',
'help'=>'Time to live of SOA record'
),
'minimum' => array('type'=>'integer',
'help'=>'Default time to live period'
),
'retry' => array('type'=>'integer',
'help'=>'Retry transfer period'
),
'expire' => array('type'=>'integer',
'help'=>'Expire period'
),
'info' => array('type'=>'string',
'help' =>'Zone description'
)
);
function DnsZones($SoapEngine) {
dprint("init DnsZones");
$this->filters = array(
'name' => trim($_REQUEST['name_filter']),
'info' => trim($_REQUEST['info_filter'])
);
$this->Records($SoapEngine);
$this->sortElements=array('changeDate' => 'Change date',
'name' => 'Name'
);
$this->Fields['nameservers'] = array('type'=>'text',
'name'=>'Name servers',
'help'=>'Authoritative name servers'
);
}
function showAfterEngineSelection () {
if ($this->SoapEngine->name_servers) {
//printf (" Available name servers: %s",$this->SoapEngine->name_servers);
}
}
function listRecords() {
$this->showSeachForm();
// Filter
$filter=array('name' => $this->filters['name'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id
Owner
Zone
Administrator
Info
Serial
Default TTL
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->zones[$i]) break;
$zone = $result->zones[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&name_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($zone->name)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$zone->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['name_filter'] == $zone->name) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$zone_url=sprintf('%s&service=%s&name_filter=%s',
$this->url,
$this->SoapEngine->service,
$zone->name
);
$records_url = $this->url.sprintf("&service=dns_records@%s&zone_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($zone->name)
);
if ($this->adminonly) $zone_url .= sprintf("&reseller_filter=%s",$zone->reseller);
if ($this->adminonly) $records_url .= sprintf("&reseller_filter=%s",$zone->reseller);
$customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($zone->customer)
);
sort($zone->nameservers);
$ns_text='';
foreach ($zone->nameservers as $ns) {
$ns_text.= $ns." ";
}
printf("
%s
%s.%s
%s
%s
%s
Records
%s
%s
%s
%s
",
$index,
$customer_url,
$zone->customer,
$zone->reseller,
$zone_url,
$zone->name,
$zone->email,
$zone->info,
$records_url,
$zone->serial,
$zone->ttl,
$zone->changeDate,
$_url,
$actionText
);
printf("
");
$i++;
}
}
print "
";
if ($this->rows == 1) {
$this->showRecord($zone);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['name'])) {
print "
Error: missing Dns zone name ";
return false;
}
$name=$this->filters['name'];
$function=array('commit' => array('name' => 'deleteZone',
'parameters' => array($name),
'logs' => array('success' => sprintf('Dns zone %s has been deleted',$this->filters['name'])
)
)
);
unset($this->filters);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showAddForm() {
if ($this->selectionActive) return;
printf ("
",$_SERVER['PHP_SELF']);
print "
";
print "
";
$this->showCustomerTextBox();
printf ("
DNS zone
",$_REQUEST['name']);
$this->printHiddenFormElements();
printf (" Import DNS zones from file:
"
);
print "
";
}
function addRecord($dictionary=array()) {
$name = trim($_REQUEST['name']);
$info = trim($_REQUEST['info']);
$name_servers = trim($_REQUEST['name_servers']);
if ($_FILES['import_file']['tmp_name']) {
$content=fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']);
//print_r($content);
if (!$imported_data=json_decode($content, true)) {
printf ("Error: reading imported data. ");
return false;
}
//print_r($imported_data);
if (!in_array('dns_zones', array_keys($imported_data))) {
printf ("
Error: Missing zones in imported data. ");
return false;
}
if (!in_array('dns_records', array_keys($imported_data))) {
return false;
printf ("
Error: Missing records in imported data. ");
}
foreach($imported_data['customers'] as $customer) {
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$customer['credit'] = floatval($customer['credit']);
$customer['balance'] = floatval($customer['balance']);
// Call function
$this->log_action('addAccount');
$result = $this->SoapEngine->soapclientCustomers->addAccount($customer);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 5001) {
$result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf ("
Error: $log ");
} else {
printf('
Customer %s has been updated',$customer['id']);
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf ("
Error: $log ");
}
} else {
printf('
Customer %s has been added',$customer['id']);
}
}
$name_servers = array();
foreach($imported_data['dns_zones'] as $zone) {
flush();
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('addZone');
$result = $this->SoapEngine->soapclient->addZone($zone);
$name_servers[$zone['name']] = $zone['nameservers'];
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 7001) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('updateZone');
$result = $this->SoapEngine->soapclient->updateZone($zone);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf ("
Error: $log ");
} else {
printf('
Zone %s has been updated',$zone['name']);
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf ("
Error: $log ");
}
} else {
printf('
Zone %s has been added',$zone['name']);
}
}
$added = 0;
$updated = 0;
foreach($imported_data['dns_records'] as $record) {
flush();
if (in_array($record['name'], $name_servers[$record['zone']]) && $record['type'] == "A") {
continue;
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('addRecord');
$result = $this->SoapEngine->soapclient->addRecord($record);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 7003) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('updateRecord');
$result = $this->SoapEngine->soapclient->updateRecord($record);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf ("
Error: $log ");
} else {
$added += 1;
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf ("
Error: $log ");
}
} else {
$added += 1;
}
}
printf('
%d DNS records added and %d updated',$added, $updated);
return true;
} else {
if (isset($this->SoapEngine->allow_none_local_dns_zones)) {
$allow_none_local_dns_zones = $this->SoapEngine->allow_none_local_dns_zones;
} else {
$allow_none_local_dns_zones = false;
}
if (!strlen($name)) {
printf ("
Error : Missing zone name.
");
return false;
}
$lookup1 = dns_get_record($name);
//dprint_r($lookup1);
$ns_array1=explode(" ",trim($this->SoapEngine->name_servers));
if (empty($lookup1) || $allow_none_local_dns_zones){
$valid = 1;
} else {
$valid = 0;
foreach($lookup1 as $lrecord){
if ($lrecord['type'] == 'NS') {
if(in_array($lrecord['target'],$ns_array1)){
$valid = 1 ;
}
}
}
}
if ($valid==0){
printf ("Error : DNS zone already exists on other server. Please contact our support if you plan to transfer this DNS zone to this system.
");
return false;
}
if (is_numeric($prefix)) {
printf ("Error: Numeric zone names are not allowed. Use ENUM port instead. ");
return false;
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!trim($_REQUEST['ttl'])) {
$ttl=3600;
} else {
$ttl=intval(trim($_REQUEST['ttl']));
}
if ($name_servers) {
$ns_array=explode(" ",trim($name_servers));
} else if ($this->login_credentials['login_type'] != 'admin' && $this->SoapEngine->name_servers){
$ns_array=explode(" ",trim($this->SoapEngine->name_servers));
} else {
$ns_array=array();
}
$zone=array(
'name' => $name,
'ttl' => $ttl,
'info' => $info,
'customer' => intval($customer),
'reseller' => intval($reseller),
'nameservers' => $ns_array
);
$function=array('commit' => array('name' => 'addZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('DNS zone %s has been added',$name)))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
}
function showSeachFormCustom() {
printf ("
DNS zone
",$this->filters['name']);
printf (" Info
",$this->filters['info']);
}
function showRecord($zone) {
print "";
print "
";
printf ("",$_SERVER['PHP_SELF']);
print " ";
print "
";
printf ("DNS zone %s ",$zone->name);
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
if ($item == 'nameservers') {
foreach ($zone->$item as $_item) {
$nameservers.=$_item."\n";
}
$item_value=$nameservers;
} else {
$item_value=$zone->$item;
}
if ($this->FieldsAdminOnly[$item]['name']) {
$item_name=$this->FieldsAdminOnly[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($this->FieldsAdminOnly[$item]['type'] == 'text') {
printf ("
%s
%s
%s
",
$item_name,
$item,
$item_value,
$this->FieldsAdminOnly[$item]['help']
);
} else {
printf ("
%s
%s
",
$item_name,
$item,
$item_value,
$this->FieldsAdminOnly[$item]['help']
);
}
}
}
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($item == 'nameservers') {
foreach ($zone->$item as $_item) {
$nameservers.=$_item."\n";
}
$item_value=$nameservers;
} else {
$item_value=$zone->$item;
}
if ($this->Fields[$item]['type'] == 'text') {
printf ("
%s
%s
%s
",
$item_name,
$item,
$item_value,
$this->Fields[$item]['help']
);
} else if ($this->Fields[$item]['readonly']) {
printf ("
%s
%s
%s
",
$item_name,
$item_value,
$this->Fields[$item]['help']
);
} else {
printf ("
%s
%s
",
$item_name,
$item,
$item_value,
$this->Fields[$item]['help']
);
}
}
printf (" ",$zone->id->tld);
printf (" ",$zone->id->prefix);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print " ";
print "
";
}
function updateRecord () {
if (!$_REQUEST['name_filter']) return;
//dprintf ("Updating zone %s...",$_REQUEST['name_filter']);
$filter=array('name' => $_REQUEST['name_filter']);
if (!$zone = $this->getRecord($filter)) {
return false;
}
$zone_old=$zone;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$zone->$item = intval($_REQUEST[$var_name]);
} else if ($item == 'nameservers') {
$_txt=trim($_REQUEST[$var_name]);
if (!strlen($_txt)) {
unset($zone->$item);
} else {
$_nameservers=array();
$_lines=explode("\n",$_txt);
foreach ($_lines as $_line) {
$_ns=trim($_line);
$_nameservers[]=$_ns;
}
$zone->$item=$_nameservers;
}
} else {
$zone->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name=$item.'_form';
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$zone->$item = intval($_REQUEST[$var_name]);
} else {
$zone->$item = trim($_REQUEST[$var_name]);
}
}
}
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('DNS zone %s has been updated',$filter['name'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function getRecord($zone) {
// Filter
if (!$zone['name']) {
print "Error in getRecord(): Missing zone name";
return false;
}
$filter=array('name' => $zone['name']);
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->zones[0]){
return $result->zones[0];
} else {
return false;
}
}
}
function getRecordKeys() {
// Filter
$filter=array('name' => $this->filters['name'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 200
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
// Call function
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->zones as $zone) {
$this->selectionKeys[]=array('name' => $zone->name);
}
return true;
}
}
function hide_html() {
if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') {
return true;
} else {
return false;
}
}
}
class DnsRecords extends Records {
var $max_zones_selection = 50;
var $typeFilter = false;
var $default_ttl = 3600;
var $fancy = false;
var $sortElements = array(
'changeDate' => 'Change date',
'type' => 'Type',
'name' => 'Name'
);
var $FieldsReadOnly = array(
'customer',
'reseller'
);
var $Fields = array(
'type' => array('type'=>'string'),
'priority' => array('type'=>'integer'),
'value' => array('type'=>'string'),
'ttl' => array('type'=>'integer')
);
var $recordTypes = array(
'A' => 'IP address',
'AAAA' => 'IP v6 address',
'CNAME' => 'Hostname alias',
'MX' => 'Mail server address',
'SRV' => 'Server resource',
'NS' => 'Name server address',
'NAPTR' => 'Name authority',
'PTR' => 'Reverse IP address',
'TXT' => 'Text',
'LOC' => 'Geo location'
);
var $havePriority = array('MX','SRV','NAPTR');
var $addRecordFunction = 'addRecord';
var $deleteRecordFunction = 'deleteRecord';
var $updateRecordFunction = 'updateRecord';
var $getRecordsFunction = 'getRecords';
var $getRecordFunction = 'getRecord';
var $recordTypesTemplate = array(
'sip2sip' => array(
'name' => 'SIP2SIP infrastructure',
'records' => array(
'naptr1' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => '20 100 "s" "SIP+D2T" "" _sip._tcp'
),
'naptr2' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => '30 100 "s" "SIP+D2U" "" _sip._udp'
),
'naptr3' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => '10 100 "s" "SIPS+D2T" "" _sips._tcp'
),
'srv1' => array(
'name' => '_sip._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => '100 5060 proxy.sipthor.net'
),
'srv2' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => '100 5060 proxy.sipthor.net'
),
'srv3' => array(
'name' => '_sips._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => '100 5061 proxy.sipthor.net'
),
'srv4' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 stun1.sipthor.net'
),
'srv5' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 stun2.sipthor.net'
),
'srv6' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay.sipthor.net'
),
'txt1' => array(
'name' => 'xcap',
'type' => 'TXT',
'priority' => '10',
'value' => 'https://xcap.sipthor.net/xcap-root'
)
),
),
'siptcp' => array(
'name' => 'SIP - TCP transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '10 100 "s" "SIP+D2T" "" _sip._tcp'
),
'srv' => array(
'name' => '_sip._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5060 #VALUE#|10 5060 sip'
)
),
),
'siptls' => array(
'name' => 'SIP - TLS transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '20 100 "s" "SIPS+D2T" "" _sips._tcp'
),
'srv' => array(
'name' => '_sips._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5061 #VALUE#|10 5061 sip'
)
)
),
'sipudp' => array(
'name' => 'SIP - UDP transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '30 100 "s" "SIP+D2U" "" _sip._udp'
),
'srv' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5060 #VALUE#|10 5060 sip'
)
),
),
'stun' => array(
'name' => 'STUN - NAT mirror',
'records' => array(
'srv' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 #VALUE#|10 3478 stun'
)
),
),
'xmpp-server' => array(
'name' => 'XMPP server-to-server over TCP',
'records' => array(
'srv' => array(
'name' => '_xmpp-server._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
),
'srv1' => array(
'name' => '_jabber._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
)
),
),
'xmpp-client' => array(
'name' => 'XMPP client-to-server over TCP',
'records' => array(
'srv' => array(
'name' => '_xmpp-client._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5222 #VALUE#|10 5222 xmpp'
)
),
),
'xmpps-server' => array(
'name' => 'XMPP server-to-server over TLS',
'records' => array(
'srv' => array(
'name' => '_xmpps-server._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
),
'srv1' => array(
'name' => '_jabbers._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
)
),
),
'xmpps-client' => array(
'name' => 'XMPP client-to-server over TLS',
'records' => array(
'srv' => array(
'name' => '_xmpps-client._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5222 #VALUE#|10 5222 xmpp'
)
),
),
'msrp' => array(
'name' => 'MSRP - IM relay',
'records' => array(
'srv' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay'
)
)
),
'sipthor' => array(
'name' => 'SIP - Thor network',
'records' => array(
'eventserver' => array(
'name' => '_eventserver._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 8000 eventserver'
),
'sipserver' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '10',
'value' => '30 5060 proxy'
),
'sipns1' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns1'
),
'sipns2' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns2'
),
'sipns3' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns3'
),
'ngnproserver' => array(
'name' => '_ngnpro._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 9200 ngnpro'
),
'ngnns1' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns1'
),
'ngnns2' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns2'
),
'ngnns3' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns3'
),
'xcapserver' => array(
'name' => '_xcap._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 443 xcap'
),
'xcapns1' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns1'
),
'xcapns2' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns2'
),
'xcapns3' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns3'
),
'msrpserver' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay'
),
'msrpns1' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns1'
),
'msrpns2' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns2'
),
'msrpns3' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns3'
),
'voicemail' => array(
'name' => '_voicemail._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 9200 voicemail'
),
'vmns1' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns1'
),
'vmns2' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns2'
),
'vmns3' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns3'
)
)
)
);
function DnsRecords($SoapEngine) {
dprint("init DnsRecords");
$_name = trim($_REQUEST['name_filter']);
if (strlen($_name) && !strstr($_name,'.') && !strstr($_name,'%')) {
$_name .= '%';
}
if ($this->typeFilter) {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'zone' => trim($_REQUEST['zone_filter']),
'name' => $_name,
'type' => $this->typeFilter,
'value' => trim($_REQUEST['value_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
} else {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'zone' => trim($_REQUEST['zone_filter']),
'name' => $_name,
'type' => trim($_REQUEST['type_filter']),
'value' => trim($_REQUEST['value_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
}
$this->Records($SoapEngine);
$this->getAllowedDomains();
}
function listRecords() {
$this->showSeachForm();
if ($this->typeFilter) {
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->typeFilter,
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
} else {
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->filters['type'],
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
}
// Range
$range = array(
'start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action($this->getRecordsFunction);
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows > 1 && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found. Click on record id to edit the values.
";
if ($this->fancy) {
print "
Zone owner
Zone
Id
Name
Type
Value
Owner
Change date
Actions
";
} else {
print "
Zone owner
Zone
Id
Name
Type
Priority
Value
TTL
Change date
Actions
";
}
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->records[$i]) {
break;
}
$record = $result->records[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf(
"&service=%s&action=Delete&name_filter=%s&zone_filter=%s&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($record->name),
urlencode($record->zone),
urlencode($record->id)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$record->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $record->id) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_customer_url = $this->url.sprintf(
"&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($record->customer)
);
$_zone_url = $this->url.sprintf(
"&service=dns_zones@%s&name_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($record->zone)
);
if ($this->adminonly) {
$_zone_url.= sprintf("&reseller_filter=%s", $record->reseller);
}
$_record_url = $this->url.sprintf(
"&service=%s@%s&zone_filter=%s&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($this->SoapEngine->soapEngine),
urlencode($record->zone),
urlencode($record->id)
);
if ($this->adminonly) $_record_url.= sprintf ("&reseller_filter=%s",$record->reseller);
if ($record->owner) {
$_owner_url = sprintf(
"%s ",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($record->owner),
$record->owner
);
} else {
$_owner_url='';
}
if ($this->fancy) {
printf(
"
%s
%s.%s
%s
%s
%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$record->customer,
$record->reseller,
$_zone_url,
$record->zone,
$_record_url,
$record->id,
$record->name,
$record->type,
$record->value,
$record->owner,
$record->changeDate,
$_url,
$actionText
);
} else {
printf("
%s
%s.%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$record->customer,
$record->reseller,
$_zone_url,
$record->zone,
$_record_url,
$record->id,
$record->name,
$record->type,
$record->priority,
$record->value,
$record->ttl,
$record->changeDate,
$_url,
$actionText
);
}
$i++;
}
}
print "
";
if ($this->rows == 1 ) {
$this->showRecord($record);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showSeachFormCustom() {
printf(
"
Record Id
",
$this->filters['id']
);
printf(
"
Name
",
$this->filters['name']
);
if (count($this->allowedDomains) > 0) {
$selected_zone[$this->filters['zone']]='selected';
print "Zone";
foreach ($this->allowedDomains as $_zone) {
printf(
" %s",
$_zone,
$selected_zone[$_zone],
$_zone
);
}
print " ";
} else {
printf(
"
DNS zone
",
$this->filters['zone']
);
}
if ($this->typeFilter) {
printf(
" Type %s",
$this->typeFilter,
$this->typeFilter
);
} else {
$selected_type[$this->filters['type']]='selected';
echo "
Type";
foreach (array_keys($this->recordTypes) as $_type) {
printf(
" %s",
$_type,
$selected_type[$_type],
$_type
);
}
echo " ";
}
printf(
"
Value
",
$this->filters['value']
);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id=$dictionary['id'];
} else {
$id=$this->filters['id'];
}
if (!$id) {
print "
Missing record id. ";
return false;
}
$function = array(
'commit' => array(
'name' => $this->deleteRecordFunction,
'parameters' => array($id),
'logs' => array('success' => sprintf('DNS record %s has been deleted',$id))
)
);
$zone=$this->filters['zone'];
unset($this->filters);
$this->filters['zone']=$zone;
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showAddForm() {
/*
if ($this->adminonly) {
if (!$this->filters['reseller']) {
print "
To add a new record you must search first for a customer";
return;
}
}
*/
printf("
", $_SERVER['PHP_SELF']);
print "";
if ($this->adminonly) {
printf(
"
",
$this->filters['reseller']
);
}
print "
Name
";
printf(
"
",
trim($_REQUEST['name'])
);
if (count($this->allowedDomains) > 0) {
if ($_REQUEST['zone']) {
$selected_zone[$_REQUEST['zone']]='selected';
} else if ($this->filters['zone']) {
$selected_zone[$this->filters['zone']]='selected';
} else if ($_zone=$this->getCustomerProperty('dns_records_last_zone')) {
$selected_zone[$_zone]='selected';
}
print ".
";
foreach ($this->allowedDomains as $_zone) {
printf(
"%s",
$_zone,
$selected_zone[$_zone],
$_zone
);
}
print " ";
} else {
if ($_REQUEST['zone']) {
$_zone_selected=$_REQUEST['zone'];
} else if ($this->filters['zone']) {
$_zone_selected=$this->filters['zone'];
} else if ($_zone=$this->getCustomerProperty('dns_records_last_zone')) {
$_zone_selected=$_zone;
}
printf(
"
DNS zone
",
$_zone_selected
);
}
if ($this->typeFilter) {
printf("Type %s
",$this->typeFilter,$this->typeFilter);
} else {
print "
Type ";
if ($_REQUEST['type']) {
$selected_type[$_REQUEST['type']]='selected';
} else if ($_type=$this->getCustomerProperty('dns_records_last_type')) {
$selected_type[$_type]='selected';
}
foreach(array_keys($this->recordTypes) as $_type) {
printf("%s - %s",$_type,$selected_type[$_type],$_type,$this->recordTypes[$_type]);
}
foreach(array_keys($this->recordTypesTemplate) as $_type) {
printf(" %s",$_type,$selected_type[$_type],$this->recordTypesTemplate[$_type]['name']);
}
print "
";
}
printf(
"
Value
",
trim($_REQUEST['value'])
);
if (!$this->fancy) {
printf(
"
Priority
",
trim($_REQUEST['priority'])
);
}
$this->printHiddenFormElements();
print "
";
}
function getAllowedDomains() {
// Filter
$filter = array(
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => $this->max_zones_selection
);
// Order
$orderBy = array(
'attribute' => 'name',
'direction' => 'ASC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->total > $this->max_zones_selection) return false;
foreach($result->zones as $zone) {
if (in_array($zone->name,$this->allowedDomains)) continue;
$this->allowedDomains[]=$zone->name;
$seen[$zone->name]++;
}
}
}
function addRecord($dictionary=array()) {
if ($this->typeFilter) {
$type = $this->typeFilter;
} else if ($dictionary['type']) {
$type = $dictionary['type'];
} else {
$type = trim($_REQUEST['type']);
}
if ($dictionary['name']) {
$name = $dictionary['name'];
} else {
$name = trim($_REQUEST['name']);
}
$name = rtrim($name,".");
if (preg_match("/^(.+)@(.*)$/", $name, $m)) {
$zone = $m[2];
} else {
if ($dictionary['zone']) {
$zone=$dictionary['zone'];
$this->skipSaveProperties=true;
} else if ($_REQUEST['zone']) {
$zone=$_REQUEST['zone'];
}
if ($type == 'MBOXFW') {
$name .= '@'.$zone;
}
}
if (!strlen($zone)) {
if ($this->html) {
echo "Error : Missing zone name.
";
}
return false;
}
$this->filters['zone']=$zone;
if (!strlen($type)) {
if ($this->html) {
echo "Error : Missing record type.
";
}
return false;
}
if ($dictionary['value']) {
$value = $dictionary['value'];
} else {
$value = trim($_REQUEST['value']);
}
$value=rtrim($value,".");
if ($this->adminonly) {
if ($dictionary['reseller']) {
} else if ($this->filters['reseller']) {
} else {
if ($this->html) {
echo "Error : Missing reseller, please first search zones for a given reseller
";
}
return false;
}
}
if ($dictionary['ttl']) {
$ttl = intval($dictionary['ttl']);
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if (!$ttl) $ttl=3600;
if ($dictionary['owner']) {
$owner = intval($dictionary['owner']);
} else {
$owner = intval(trim($_REQUEST['owner']));
}
if ($dictionary['priority']) {
$priority = $dictionary['priority'];
} else {
$priority = trim($_REQUEST['priority']);
}
if (in_array($type,array_keys($this->recordTypes))) {
// See RFC 1912 - Section 2.4
if (trim($name).trim($zone) == trim($zone) && $type == 'CNAME') {
printf(
"Error : CNAME (%s) equal to zone name (%s) is not allowed
",
trim($name).trim($zone),
trim($zone)
);
return false;
}
if (!strlen($value)) {
if ($this->html) {
echo "Error : Missing record value.
";
}
return false;
}
$record = array(
'name' => trim($name),
'zone' => trim($zone),
'type' => $type,
'value' => trim($value),
'owner' => intval($owner),
'ttl' => intval($ttl),
'priority' => intval($priority)
);
if (!$this->skipSaveProperties=true) {
$_p = array(
array(
'name' => 'dns_records_last_zone',
'category' => 'web',
'value' => $_REQUEST['zone'],
'permission' => 'customer'
),
array(
'name' => 'dns_records_last_type',
'category' => 'web',
'value' => "$type",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$function = array(
'commit' => array(
'name' => $this->addRecordFunction,
'parameters' => array($record),
'logs' => array('success' => sprintf('DNS record %s under %s has been added',$name,$zone))
)
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($this->html) {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
}
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
} else if (in_array($type,array_keys($this->recordTypesTemplate))) {
$push_notifications_server = $this->getResellerProperty('push_notifications_server_private') or $this->getResellerProperty('push_notifications_server');
if ($type == "sip2sip" && $push_notifications_server) {
if (preg_match("/^(.*):(\d+);transport=(.*)$/", $push_notifications_server, $m)) {
$push_hostname = $m[1];
$push_port = $m[2];
$push_transport = $m[3];
if ($push_transport == "tls") {
$naptr_type = "_sips._tcp";
$naptr_s = "SIPS+D2T";
} else if ($push_transport == "tcp") {
$naptr_type = "_sip._tcp";
$naptr_s = "SIP+D2T";
} else {
$naptr_type = "_sip._udp";
$naptr_s = "SIP+D2U";
}
$this->recordTypesTemplate[$type]['records']['push_naptr'] =
array(
'name' => 'push',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => sprintf('10 100 "s" "%s" "" %s.push', $naptr_s, $naptr_type)
);
$this->recordTypesTemplate[$type]['records']['push_srv'] =
array(
'name' => sprintf('%s.push', $naptr_type),
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => sprintf('100 %d %s', $push_port, $push_hostname)
);
}
}
foreach (array_values($this->recordTypesTemplate[$type]['records']) as $_records) {
$value_new='';
if (strlen($_records['value'])) {
if (preg_match("/^_sip/",$_records['name'])) {
if (!$value) {
$value=$this->getCustomerProperty('dns_records_last_sip_server');
if (!$value) {
$value = $this->getCustomerProperty('sip_proxy');
}
if (!value) {
$value = $this->SoapEngine->default_sip_proxy;
}
$save_new_value=false;
} else {
$save_new_value=true;
}
}
$els=explode("|",$_records['value']);
foreach ($els as $el) {
if (preg_match("/#VALUE#/",$el)) {
if ($value) {
$value_new=preg_replace("/#VALUE#/",$value,$el);
} else {
continue;
}
} else {
$value_new=$el;
}
break;
}
// save value if type sip server
if ($save_new_value && $_records['name'] && preg_match("/^_sip/",$_records['name'])) {
$_p = array(
array(
'name' => 'dns_records_last_sip_server',
'category' => 'web',
'value' => $value,
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
}
if (!in_array($_records['type'],array_keys($this->recordTypes))) {
continue;
}
$record = array(
'name' => $_records['name'],
'zone' => trim($zone),
'type' => $_records['type'],
'value' => $value_new,
'owner' => intval($owner),
'ttl' => intval($_records['ttl']),
'priority' => intval($_records['priority'])
);
//print_r($record);
$function=array(
'commit' => array(
'name' => $this->addRecordFunction,
'parameters' => array($record),
'logs' => array(
'success' => sprintf('Dns %s record under %s has been added', $_records['type'], $zone)
)
)
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($this->html) {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
}
syslog(LOG_NOTICE, $log);
return false;
}
}
} else {
if ($this->html) {
printf ("Error : Invalid or missing record type.
");
}
return false;
}
return true;
}
function getRecordKeys() {
// Filter
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->filters['type'],
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => 1000
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecords');
// Call function
$result = $this->SoapEngine->soapclient->getRecords($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->records as $record) {
$this->selectionKeys[]=array('id' => $record->id);
}
return true;
}
}
function showRecord($record) {
echo "Record ";
printf("", $_SERVER['PHP_SELF']);
echo " ";
printf(
"
",
$record->name
);
foreach (array_keys($this->Fields) as $item) {
if (is_array($this->havePriority) && $item == 'priority' && !in_array($record->type,$this->havePriority)) {
continue;
}
if ($this->Fields[$item]['name']) {
$item_name = $this->Fields[$item]['name'];
} else {
$item_name = ucfirst($item);
}
if ($item == 'type') {
$selected_type[$record->$item]='selected';
$select_box=sprintf("",$item);
foreach(array_keys($this->recordTypes) as $_type) {
$select_box .= sprintf(
"%s - %s",
$_type,
$selected_type[$_type],
$_type,
$this->recordTypes[$_type]
);
}
foreach(array_keys($this->recordTypesTemplate) as $_type) {
$select_box .= sprintf(
" %s",
$_type,
$selected_type[$_type],
$this->recordTypesTemplate[$_type]['name']
);
}
$select_box .= " ";
printf(
"
",
$item_name,
$select_box
);
} else if ($this->Fields[$item]['type'] == 'text') {
printf(
"
",
$item_name,
$item,
$record->$item
);
} else {
if ($record->type == 'NAPTR' and $item == 'value') {
$help_text = 'Priority field will be used for the preference part of the value';
} else {
$help_text = '';
}
printf(
"
";
}
}
printf(" ", $record->id);
$this->printFiltersToForm();
$this->printHiddenFormElements();
echo "
";
echo " ";
}
function getRecord($id) {
// Filter
if (!$id) {
print "Error in getRecord(): Missing record id";
return false;
}
$filter = array('id' => $id);
// Range
$range = array(
'start' => 0,
'count' => 1
);
// Order
$orderBy = array(
'attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action($this->getRecordsFunction);
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->records[0]){
return $result->records[0];
} else {
return false;
}
}
}
function updateRecord () {
//print "Updating record ...";
if (!$_REQUEST['id_filter']) return;
if (!$record = $this->getRecord(intval($_REQUEST['id_filter']))) {
return false;
}
$record_old=$record;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$record->$item = intval($_REQUEST[$var_name]);
} else {
$record->$item = trim($_REQUEST[$var_name]);
}
}
$function=array('commit' => array('name' => $this->updateRecordFunction,
'parameters' => array($record),
'logs' => array('success' => sprintf('Record %s has been updated',$_REQUEST['id_filter'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showTextBeforeCustomerSelection() {
print _("Zone owner");
}
}
class FancyRecords extends DnsRecords {
var $fancy = true;
var $addRecordFunction = 'addFancyRecord';
var $deleteRecordFunction = 'deleteFancyRecord';
var $updateRecordFunction = 'updateFancyRecord';
var $getRecordsFunction = 'getFancyRecords';
var $getRecordFunction = 'getFancyRecord';
var $recordTypesTemplate=array();
var $Fields=array(
'type' => array('type'=>'string'),
'value' => array('type'=>'string')
);
}
class EmailAliases extends FancyRecords {
var $recordTypes=array('MBOXFW' => 'Email alias');
var $typeFilter='MBOXFW';
}
class UrlRedirect extends FancyRecords {
var $recordTypes=array('URL' => 'URL forwarding');
var $typeFilter='URL';
}
class TrustedPeers extends Records {
var $FieldsAdminOnly=array(
'msteams' => array('type'=>'boolean', 'name' => 'MS Teams'),
'prepaid' => array('type'=>'boolean'),
'tenant' => array('type'=>'string'),
'callLimit' => array('type'=>'integer', 'name' => 'Capacity'),
'blocked' => array('type'=>'integer')
);
var $Fields=array(
'description' => array('type'=>'string'),
'authToken' => array('type'=>'string', 'name' => 'Authentication token')
);
function TrustedPeers($SoapEngine) {
$this->filters = array('ip' => trim($_REQUEST['ip_filter']),
'tenant' => trim($_REQUEST['tenant_filter']),
'description' => trim($_REQUEST['description_filter']),
'msteams' => trim($_REQUEST['msteams_filter'])
);
$this->Records($SoapEngine);
$this->sortElements=array(
'changeDate' => 'Change date',
'description' => 'Description',
'ip' => 'Address'
);
}
function listRecords() {
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('ip' => $this->filters['ip'],
'description' => $this->filters['description'],
'tenant' => $this->filters['tenant'],
'msteams' => 1 == intval($this->filters['msteams'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'description';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getTrustedPeers');
$result = $this->SoapEngine->soapclient->getTrustedPeers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id
Owner
Trusted peer
Prepaid
Capacity
MS Teams
Tenant
Description
Blocked
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->peers[$i]) break;
$peer = $result->peers[$i];
$index=$this->next+$i+1;
$delete_url = $this->url.sprintf("&service=%s&action=Delete&ip_filter=%s&msteams_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($peer->ip),
urlencode(intval($peer->msteams))
);
$update_url = $this->url.sprintf("&service=%s&ip_filter=%s&msteams_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($peer->ip),
urlencode($peer->msteams)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['ip_filter'] == $peer->ip) {
$delete_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
if ($peer->msteams) {
$msteams = 'Yes';
} else {
$msteams = 'No';
}
if ($peer->prepaid) {
$prepaid = 'Yes';
} else {
$prepaid = 'No';
}
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($peer->reseller)
);
printf("
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$peer->reseller,
$update_url,
$peer->ip,
$prepaid,
$peer->callLimit,
$msteams,
$peer->tenant,
$peer->description,
$peer->blocked,
$peer->changeDate,
$delete_url,
$actionText
);
$i++;
}
}
print "
";
if ($result->total == 1) {
$this->showRecord($peer);
}
$this->showPagination($maxrows);
return true;
}
}
function showRecord($peer) {
print "";
print "
";
printf ("",$_SERVER['PHP_SELF']);
print " ";
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
if ($this->FieldsAdminOnly[$item]['name']) {
$item_name=$this->FieldsAdminOnly[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($this->FieldsAdminOnly[$item]['type'] == 'text') {
printf ("
%s
%s
",
$item_name,
$item,
$peer->$item
);
} else if ($this->FieldsAdminOnly[$item]['type'] == 'boolean') {
if ($peer->$item == 1) {
$checked = "checked";
} else {
$checked = "";
}
printf ("
%s
",
$item_name,
$item,
$checked
);
} else {
printf ("
%s
",
$item_name,
$item,
$peer->$item
);
}
}
}
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($this->Fields[$item]['type'] == 'text') {
printf ("
%s
%s
",
$item_name,
$item,
$peer->$item
);
} else if ($this->Fields[$item]['type'] == 'boolean') {
if ($peer->$item == 1) {
$checked = "checked";
} else {
$checked = "";
}
printf ("
%s
",
$item_name,
$item,
$checked
);
} else {
printf ("
%s
",
$item_name,
$item,
$peer->$item
);
}
}
print "
";
printf (" ",$peer->ip);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print " ";
print "
";
}
function showAddForm() {
//if ($this->selectionActive) return;
printf ("",$_SERVER['PHP_SELF']);
print "
";
}
function addRecord($dictionary=array()) {
if ($dictionary['ipaddress']) {
$ipaddress = $dictionary['ipaddress'];
} else {
$ipaddress = trim($_REQUEST['ipaddress']);
}
if ($dictionary['msteams']) {
$msteams = $dictionary['msteams'];
} else {
$msteams = trim($_REQUEST['msteams']);
}
$this->filters['msteams'] = $msteams;
if ($dictionary['description']) {
$description = $dictionary['description'];
} else {
$description = trim($_REQUEST['description']);
}
if ($dictionary['tenant']) {
$tenant = $dictionary['tenant'];
} else {
$tenant = trim($_REQUEST['tenant']);
}
if ($dictionary['callLimit']) {
$callLimit = $dictionary['callLimit'];
} else {
$callLimit = trim($_REQUEST['callLimit']);
}
if ($dictionary['owner']) {
$owner = $dictionary['owner'];
} else {
$owner = trim($_REQUEST['owner']);
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!strlen($ipaddress)) {
printf ("Error: Missing IP or description. ");
return false;
}
$peer=array(
'ip' => $ipaddress,
'description' => $description,
'callLimit' => intval($callLimit),
'msteams' => 1 == $msteams,
'tenant' => $tenant,
'blocked' => 0,
'owner' => intval($_REQUEST['owner']),
'customer' => intval($customer),
'reseller' => intval($reseller)
);
$function=array('commit' => array('name' => 'addTrustedPeer',
'parameters' => array($peer),
'logs' => array('success' => sprintf('Trusted peer %s has been added',$ipaddress)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function updateRecord() {
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!strlen($this->filters['ip'])) {
print "
Error: missing peer address. ";
return false;
}
$peer=array(
'ip' => $this->filters['ip'],
'description' => $_REQUEST['description_form'],
'authToken' => $_REQUEST['authToken_form'],
'tenant' => $_REQUEST['tenant_form'],
'callLimit' => intval($_REQUEST['callLimit_form']),
'prepaid' => 1 == $_REQUEST['prepaid_form'],
'blocked' => intval($_REQUEST['blocked_form']),
'msteams' => 1 == $_REQUEST['msteams_form'],
'customer' => intval($customer),
'reseller' => intval($reseller)
);
$function=array('commit' => array('name' => 'updateTrustedPeer',
'parameters' => array($peer),
'logs' => array('success' => sprintf('Trusted peer %s has been updated',$this->filters['ip'])))
);
return $this->SoapEngine->execute($function,$this->html);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['ip'])) {
print "
Error: missing IP address. ";
return false;
}
$function=array('commit' => array('name' => 'deleteTrustedPeer',
'parameters' => array($this->filters['ip']),
'logs' => array('success' => sprintf('Trusted peer %s has been deleted',$this->filters['ip'])))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
if (intval($this->filters['msteams']) == 1) {
$checked_msteams = 'checked';
} else {
$checked_msteams = '';
}
printf ("
Address
",$this->filters['ip']);
printf (" Description
",$this->filters['description']);
printf (" Tenant
",$this->filters['tenant']);
printf (" Blocked
",$this->filters['blocked']);
printf (" MS Teams
",$checked_msteams);
}
function showCustomerTextBox () {
print "Owner ";
$this->showResellerForm('reseller');
print "
";
}
function showTextBeforeCustomerSelection() {
print "Owner";
}
function showCustomerForm($name='customer_filter') {
}
}
class Carriers extends Records {
var $carriers=array();
var $Fields=array(
'id' => array('type'=>'integer',
'readonly' => true),
'name' => array('type'=>'string')
);
var $sortElements=array(
'changeDate' => 'Change date',
'name' => 'Carrier'
);
function Carriers($SoapEngine) {
$this->filters = array('id' => trim($_REQUEST['id_filter']),
'name' => trim($_REQUEST['name_filter'])
);
$this->Records($SoapEngine);
}
function showCustomerTextBox () {
print "Reseller";
print "";
$this->showResellerForm('reseller');
print "";
}
function listRecords() {
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array(
'id' => intval($this->filters['id']),
'name' => $this->filters['name'],
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getCarriers');
$result = $this->SoapEngine->soapclient->getCarriers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
print "
$this->rows records found
";
print "
Id
Owner
Carrier
Name
Gateways
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->carriers[$i]) break;
$carrier = $result->carriers[$i];
$index=$this->next+$i+1;
$_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($carrier->id)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $carrier->id) {
$_delete_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($carrier->id),
urlencode($carrier->reseller)
);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($carrier->reseller)
);
$_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%d&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($carrier->id),
urlencode($carrier->reseller)
);
printf("
%s
%s
%s
%s
Gateways
%s
%s
",
$index,
$_customer_url,
$carrier->reseller,
$_url,
$carrier->id,
$carrier->name,
$_gateway_url,
$carrier->changeDate,
$_delete_url,
$actionText
);
printf("
");
$i++;
}
}
print "
";
if ($this->rows == 1) {
$this->showRecord($carrier);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showAddForm() {
//if ($this->selectionActive) return;
printf ("",$_SERVER['PHP_SELF']);
print "
";
print "
";
print "
";
}
function addRecord($dictionary=array()) {
if ($dictionary['name']) {
$name=$dictionary['name'];
} else {
$name = trim($_REQUEST['name']);
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
$structure=array('name' => $name,
'reseller' => intval($reseller)
);
if (!strlen($name)) {
printf ("
Error: Missing name. ");
return false;
}
$function=array('commit' => array('name' => 'addCarrier',
'parameters' => array($structure),
'logs' => array('success' => sprintf('Carrier %s has been added',$name)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id = $dictionary['id'];
} else {
$id = trim($this->filters['id']);
}
if (!strlen($id)) {
print "
Error: missing carrier id ";
return false;
}
$function=array('commit' => array('name' => 'deleteCarrier',
'parameters' => array(intval($id)),
'logs' => array('success' => sprintf('Carrier %d has been deleted',$id)))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf ("
Carrier
",$this->filters['id']);
printf ("
Name
",$this->filters['name']);
}
function showCustomerForm($name='customer_filter') {
}
function showTextBeforeCustomerSelection() {
print "Owner";
}
function getRecord($id) {
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('id' => intval($id));
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'name';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getCarriers');
$result = $this->SoapEngine->soapclient->getCarriers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->carriers[0]){
return $result->carriers[0];
} else {
return false;
}
}
}
function showRecord($carrier) {
print "
Carrier ";
printf ("
",$_SERVER['PHP_SELF']);
print " ";
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
printf ("%s
",
$item_name
);
if ($this->Fields[$item]['readonly']) {
printf (" %s
",
$item,
$carrier->$item,
$carrier->$item
);
} else {
printf ("
",
$item,
$carrier->$item
);
}
print "
";
}
printf (" ",$carier->id);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print "
";
print "";
}
function updateRecord () {
//print "Updating carrier ...";
if (!$_REQUEST['id_filter']) return;
if (!$carrier = $this->getRecord($_REQUEST['id_filter'])) {
return false;
}
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
if ($this->Fields[$item]['type'] == 'integer') {
$carrier->$item = intval($_REQUEST[$var_name]);
} else {
$carrier->$item = trim($_REQUEST[$var_name]);
}
}
$function=array('commit' => array('name' => 'updateCarrier',
'parameters' => array($carrier),
'logs' => array('success' => sprintf('Carrier %d has been updated',$_REQUEST['id_filter'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result) ;
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
}
class Gateways extends Records {
var $carriers=array();
var $FieldsReadOnly=array(
'reseller',
'changeDate'
);
var $Fields=array(
'id' => array('type'=>'integer',
'readonly' => true),
'name' => array('type'=>'string'),
'carrier_id' => array('type'=>'integer'),
'transport' => array('type'=>'string'),
'ip' => array('name'=>'IP or hostname',
'type'=>'string'),
'port' => array('type'=>'integer')
);
//var $transports=array('udp','tcp','tls');
var $transports=array('udp');
function Gateways($SoapEngine) {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'name' => trim($_REQUEST['name_filter']),
'carrier_id' => trim($_REQUEST['carrier_id_filter'])
);
$this->sortElements=array(
'changeDate' => 'Change date',
'name' => 'Gateway',
'carrier_id' => 'Carrier',
'ip' => 'Address'
);
$this->Records($SoapEngine);
}
function listRecords() {
$this->getCarriers();
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('id' => intval($this->filters['id']),
'name' => $this->filters['name'],
'carrier_id'=> intval($this->filters['carrier_id']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getGateways');
$result = $this->SoapEngine->soapclient->getGateways($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
print "
$this->rows records found
";
print "
Id
Owner
Gateway
Carrier
Name
Address
Rules
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->gateways[$i]) break;
$gateway = $result->gateways[$i];
$index=$this->next+$i+1;
$_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($gateway->id)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $gateway->id) {
$_delete_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_url = $this->url.sprintf("&service=%s&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($gateway->id)
);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($gateway->reseller)
);
$_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($gateway->carrier_id),
urlencode($gateway->reseller)
);
$_rules_url = $this->url.sprintf("&service=gateway_rules@%s&gateway_id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($gateway->id),
urlencode($gateway->reseller)
);
$_r=0;
printf("
%s
%s
%s
%s
%s
%s:%s:%s
Rules
%s
%s
",
$index,
$_customer_url,
$gateway->reseller,
$_url,
$gateway->id,
$_carrier_url,
$gateway->carrier,
$gateway->name,
$gateway->transport,
$gateway->ip,
$gateway->port,
$_rules_url,
$gateway->changeDate,
$_delete_url,
$actionText
);
printf("
");
$i++;
}
}
print "
";
if ($this->rows == 1) {
$this->showRecord($gateway);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showAddForm() {
//if ($this->selectionActive) return;
$this->getCarriers();
if (!count($this->carriers)) {
print "Create a carrier first";
return false;
}
printf ("
",$_SERVER['PHP_SELF']);
print "
";
print "
";
printf (" Carrier ");
print "
";
foreach (array_keys($this->carriers) as $_carrier) {
printf ("%s",$_carrier,$this->carriers[$_carrier]);
}
printf (" ");
printf ("
Name
");
printf ("
Transport ");
print " ";
foreach ($this->transports as $_transport) {
printf ("%s",$_transport,$_transport);
}
printf ("
");
printf ("
Address
");
$this->printHiddenFormElements();
print "
";
}
function addRecord($dictionary=array()) {
if ($dictionary['name']) {
$name = $dictionary['name'];
} else {
$name = trim($_REQUEST['name']);
}
if ($dictionary['carrier_id']) {
$carrier_id = $dictionary['carrier_id'];
} else {
$carrier_id = trim($_REQUEST['carrier_id']);
}
if ($dictionary['address']) {
$address = $dictionary['address'];
} else {
$address = trim($_REQUEST['address']);
}
if ($dictionary['transport']) {
$transport = $dictionary['transport'];
} else {
$transport = trim($_REQUEST['transport']);
}
if (!strlen($name) || !strlen($carrier_id) || !strlen($address)) {
printf ("Error: Missing gateway name, carrier_id or address ");
return false;
}
$address_els=explode(':',$address);
if (count($address_els) == 1) {
$ip = $address_els[0];
$port ='5060';
} else if (count($address_els) == 2) {
$ip = $address_els[0];
$port = $address_els[1];
}
if (!$port) $port = 5060;
if (!in_array($transport,$this->transports)) {
$transport=$this->transports[0];
}
$gateway=array(
'name' => $name,
'carrier_id' => intval($carrier_id),
'ip' => $ip,
'port' => intval($port),
'transport' => $transport
);
$function=array('commit' => array('name' => 'addGateway',
'parameters' => array($gateway),
'logs' => array('success' => sprintf('Gateway %s has been added',$name)))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id = $dictionary['id'];
} else {
$id = trim($this->filters['id']);
}
if (!strlen($id)) {
print "
Error: missing gateway id. ";
return false;
}
$function=array('commit' => array('name' => 'deleteGateway',
'parameters' => array(intval($id)),
'logs' => array('success' => sprintf('Gateway %d has been deleted',$id)))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf ("
Gateway
",$this->filters['id']);
print "
Carrier";
$selected_carrier[$this->filters['carrier_id']]='selected';
foreach (array_keys($this->carriers) as $_carrier) {
printf (" %s",$_carrier,$selected_carrier[$_carrier],$this->carriers[$_carrier]);
}
printf (" ");
printf (" Name
",$this->filters['name']);
}
function showCustomerForm($name='customer_filter') {
}
function showTextBeforeCustomerSelection() {
print "Owner";
}
function showRecord($gateway) {
print "Gateway ";
printf ("",$_SERVER['PHP_SELF']);
print " ";
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
printf ("
%s
",
$item_name
);
if ($this->Fields[$item]['readonly']) {
printf ("
%s
",
$item,
$gateway->$item,
$gateway->$item
);
} else {
if ($item == 'carrier_id') {
printf ("
",$item);
$selected_carrier[$gateway->$item]='selected';
foreach (array_keys($this->carriers) as $_carrier) {
printf ("%s",$_carrier,$selected_carrier[$_carrier],$this->carriers[$_carrier]);
}
printf ("
");
} else if ($item == 'transport') {
printf ("
",$item);
$selected_transport[$gateway->$item]='selected';
foreach ($this->transports as $_transport) {
printf ("%s",$_transport,$selected_transport[$_transport],$_transport);
}
print "
";
} else {
printf ("
",
$item,
$gateway->$item
);
}
}
print "
";
}
printf (" ",$gateway->id);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print "
";
print " ";
}
function updateRecord () {
//print "Updating gateway ...";
if (!$_REQUEST['id_filter']) return;
if (!$gateway = $this->getRecord($_REQUEST['id_filter'])) {
return false;
}
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
if ($this->Fields[$item]['type'] == 'integer') {
$gateway->$item = intval($_REQUEST[$var_name]);
} else {
$gateway->$item = trim($_REQUEST[$var_name]);
}
}
if (!in_array($gateway->transport,$this->transports)) {
printf ("Invalid transport '%s' ",$gateway->transport);
return false;
}
$function=array('commit' => array('name' => 'updateGateway',
'parameters' => array($gateway),
'logs' => array('success' => sprintf('Gateway %s has been updated',$_REQUEST['name_filter'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result) ;
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function getRecord($id) {
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('id' => intval($id));
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'name';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getGateways');
$result = $this->SoapEngine->soapclient->getGateways($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->gateways[0]){
return $result->gateways[0];
} else {
return false;
}
}
}
}
class GatewayRules extends Records {
var $carriers=array();
var $FieldsReadOnly=array(
'reseller',
'changeDate'
);
var $Fields=array(
'id' => array('type'=>'integer','readonly' => true),
'gateway_id' => array('type'=>'integer','name' => 'Gateway'),
'prefix' => array('type'=>'string'),
'strip' => array('type'=>'integer'),
'prepend' => array('type'=>'string'),
'minLength' => array('type'=>'integer'),
'maxLength' => array('type'=>'integer')
);
function GatewayRules($SoapEngine) {
$this->filters = array('id' => trim($_REQUEST['id_filter']),
'gateway_id' => trim($_REQUEST['gateway_id_filter']),
'carrier_id' => trim($_REQUEST['carrier_id_filter']),
'prefix' => trim($_REQUEST['prefix_filter']),
);
$this->sortElements=array(
'changeDate' => 'Change date',
'gateway' => 'Gateway',
'carrier' => 'Carrier',
'prefix' => 'Prefix'
);
$this->Records($SoapEngine);
}
function listRecords() {
$this->getCarriers();
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('id' => intval($this->filters['id']),
'gateway_id' => intval($this->filters['gateway_id']),
'carrier_id' => intval($this->filters['carrier_id']),
'prefix' => $this->filters['prefix'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->log_action('getGatewayRules');
$result = $this->SoapEngine->soapclient->getGatewayRules($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
print "
$this->rows records found
";
print "
Owner
Rule
Carrier
Gateway
Prefix
Strip
Prepend
MinLength
MaxLength
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->gateway_rules[$i]) break;
$gateway_rule = $result->gateway_rules[$i];
$index=$this->next+$i+1;
$_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($gateway_rule->id),
urlencode($gateway_rule->reseller)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $gateway_rule->id) {
$_delete_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($gateway_rule->id),
urlencode($gateway_rule->reseller)
);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($gateway_rule->reseller)
);
$_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($gateway_rule->carrier_id),
urlencode($gateway_rule->reseller)
);
$_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($gateway_rule->gateway_id),
urlencode($gateway_rule->reseller)
);
printf("
%s
%s
%s
%s (%d)
%s (%d)
%s
%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url, $gateway_rule->reseller,
$_url, $gateway_rule->id,
$_carrier_url, $gateway_rule->carrier,$gateway_rule->carrier_id,
$_gateway_url, $gateway_rule->gateway,$gateway_rule->gateway_id,
$gateway_rule->prefix,
$gateway_rule->strip,
$gateway_rule->prepend,
$gateway_rule->minLength,
$gateway_rule->maxLength,
$gateway_rule->changeDate,
$_delete_url,
$actionText
);
printf("
");
$i++;
}
}
print "
";
if ($this->rows == 1) {
$this->showRecord($gateway_rule);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showAddForm() {
//if ($this->selectionActive) return;
$this->getGateways();
if (!count($this->gateways)) {
print "Create a gateway first";
return false;
}
printf ("
",$_SERVER['PHP_SELF']);
print "
";
}
function addRecord($dictionary=array()) {
if ($dictionary['gateway_id']) {
$gateway_id = $dictionary['gateway_id'];
} else {
$gateway_id = trim($_REQUEST['gateway_id']);
}
if ($dictionary['prefix']) {
$prefix = $dictionary['prefix'];
} else {
$prefix = trim($_REQUEST['prefix']);
}
if ($dictionary['strip']) {
$strip = $dictionary['strip'];
} else {
$strip = trim($_REQUEST['strip']);
}
if ($dictionary['prepend']) {
$prepend = $dictionary['prepend'];
} else {
$prepend = trim($_REQUEST['prepend']);
}
if ($dictionary['minLength']) {
$minLength = $dictionary['minLength'];
} else {
$minLength = trim($_REQUEST['minLength']);
}
if ($dictionary['maxLength']) {
$maxLength = $dictionary['maxLength'];
} else {
$maxLength = trim($_REQUEST['maxLength']);
}
if (!strlen($gateway_id)) {
printf ("Error: Missing gateway id ");
return false;
}
$rule=array(
'gateway_id' => intval($gateway_id),
'prefix' => $prefix,
'prepend' => $prepend,
'strip' => intval($strip),
'minLength' => intval($minLength),
'maxLength' => intval($maxLength)
);
$function=array('commit' => array('name' => 'addGatewayRule',
'parameters' => array($rule),
'logs' => array('success' => sprintf('Gateway rule has been added')))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id = $dictionary['id'];
} else {
$id = trim($this->filters['id']);
}
if (!strlen($id)) {
print "
Error: missing rule id ";
return false;
}
$function=array('commit' => array('name' => 'deleteGatewayRule',
'parameters' => array(intval($id)),
'logs' => array('success' => sprintf('Gateway rule %d has been deleted',$id)))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf ("
Rule
",$this->filters['id']);
print "
Carrier";
$selected_carrier[$this->filters['carrier_id']]='selected';
foreach (array_keys($this->carriers) as $_carrier) {
printf (" %s",$_carrier,$selected_carrier[$_carrier],$this->carriers[$_carrier]);
}
printf (" ");
printf (" Gateway
",$this->filters['gateway_id']);
printf (" Prefix
",$this->filters['prefix']);
}
function showCustomerForm($name='customer_filter') {
}
function showTextBeforeCustomerSelection() {
print "Owner";
}
function showRecord($rule) {
$this->getGateways();
print "Rule ";
printf ("",$_SERVER['PHP_SELF']);
print " ";
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
printf ("
%s
",
$item_name
);
if ($this->Fields[$item]['readonly']) {
printf ("
%s
",
$item,
$rule->$item,
$rule->$item
);
} else {
if ($item == 'gateway_id') {
printf ("
",$item);
$selected_gateway[$rule->$item]='selected';
foreach (array_keys($this->gateways) as $_gateway) {
printf ("%s",$_gateway,$selected_gateway[$_gateway],$this->gateways[$_gateway]);
}
print "
";
} else {
printf ("
",
$item,
$rule->$item
);
}
}
print "
";
}
printf (" ",$rule->reseller);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print "
";
print " ";
}
function updateRecord () {
//print "Updating rule ...";
if (!$_REQUEST['id_form'] || !strlen($_REQUEST['reseller_filter'])) {
return;
}
if (!$rule = $this->getRecord($_REQUEST['id_form'])) {
return false;
}
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
if ($this->Fields[$item]['type'] == 'integer') {
$rule->$item = intval($_REQUEST[$var_name]);
} else {
$rule->$item = trim($_REQUEST[$var_name]);
}
}
$function=array('commit' => array('name' => 'updateGatewayRule',
'parameters' => array($rule),
'logs' => array('success' => sprintf('Rule %d has been updated',$_REQUEST['id_form'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result) ;
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function getRecord($id) {
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('id' => intval($id));
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
$this->sorting['sortBy'] = 'gateway';
$this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getGatewayRules');
$result = $this->SoapEngine->soapclient->getGatewayRules($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->gateway_rules[0]){
return $result->gateway_rules[0];
} else {
return false;
}
}
}
}
class Routes extends Records {
var $carriers=array();
var $Fields=array(
'id' => array('type'=>'integer',
'readonly' => true),
'carrier_id' => array('type'=>'integer','name'=>'Carrier'),
'prefix' => array('type'=>'string'),
'originator' => array('type'=>'string'),
'priority' => array('type'=>'integer')
);
var $sortElements=array(
'prefix' => 'Prefix',
'priority' => 'Priority'
);
function Routes($SoapEngine) {
$this->filters = array('prefix' => trim($_REQUEST['prefix_filter']),
'priority' => trim($_REQUEST['priority_filter']),
'carrier_id'=> trim($_REQUEST['carrier_id_filter']),
'reseller' => trim($_REQUEST['reseller_filter']),
'id' => trim($_REQUEST['id_filter'])
);
$this->Records($SoapEngine);
}
function listRecords() {
$this->getCarriers();
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('prefix' => $this->filters['prefix'],
'carrier_id' => intval($this->filters['carrier_id']),
'reseller' => intval($this->filters['reseller']),
'id' => intval($this->filters['id'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'prefix';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getRoutes');
$result = $this->SoapEngine->soapclient->getRoutes($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
print "
$this->rows records found
";
print "
Id
Owner
Route
Carrier
Gateways
Prefix
Originator
Priority
Change date
Actions
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->routes[$i]) break;
$route = $result->routes[$i];
$index=$this->next+$i+1;
$_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%d",
urlencode($this->SoapEngine->service),
urlencode($route->id)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $route->id) {
$_delete_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_url = $this->url.sprintf("&service=%s&id_filter=%d",
urlencode($this->SoapEngine->service),
urlencode($route->id)
);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($route->reseller)
);
$_carrier_url = $this->url.sprintf("&service=pstn_carriers@%s&id_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($route->carrier_id)
);
$_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($route->carrier_id),
urlencode($route->reseller)
);
printf("
%s
%s
%s
%s
Gateways
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$route->reseller,
$_url,
$route->id,
$_carrier_url,
$route->carrier,
$_gateway_url,
$route->prefix,
$route->originator,
$route->priority,
$route->changeDate,
$_delete_url,
$actionText
);
printf("
");
$i++;
}
}
print "
";
if ($this->rows == 1) {
$this->showRecord($route);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showAddForm() {
//if ($this->selectionActive) return;
if (!count($this->carriers)) {
print "Create a carrier first";
return false;
}
printf ("
";
}
function addRecord($dictionary=array()) {
if ($dictionary['prefix']) {
$prefix = $dictionary['prefix'];
} else {
$prefix = trim($_REQUEST['prefix']);
}
if ($dictionary['carrier_id']) {
$carrier_id = $dictionary['carrier_id'];
} else {
$carrier_id = trim($_REQUEST['carrier_id']);
}
if ($dictionary['originator']) {
$originator = $dictionary['originator'];
} else {
$originator = trim($_REQUEST['originator']);
}
if ($dictionary['priority']) {
$priority = $dictionary['priority'];
} else {
$priority = trim($_REQUEST['priority']);
}
if (!strlen($carrier_id)) {
printf ("Error: Missing carrier id. ");
return false;
}
$route=array(
'prefix' => $prefix,
'originator' => $originator,
'carrier_id' => intval($carrier_id),
'priority' => intval($priority)
);
$routes=array($route);
$function=array('commit' => array('name' => 'addRoutes',
'parameters' => array($routes),
'logs' => array('success' => sprintf('Route %s has been added',$prefix)))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "
Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id = $dictionary['id'];
} else {
$id = trim($this->filters['id']);
}
if (!strlen($id)) {
print "
Error: missing route id. ";
return false;
}
$route=array('id'=> intval($id));
$routes=array($route);
$function=array('commit' => array('name' => 'deleteRoutes',
'parameters' => array($routes),
'logs' => array('success' => sprintf('Route %s has been deleted',$prefix)))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf ("
Route
",$this->filters['id']);
print "
Carrier";
$selected_carrier[$this->filters['carrier_id']]='selected';
foreach (array_keys($this->carriers) as $_carrier) {
printf (" %s",$_carrier,$selected_carrier[$_carrier],$this->carriers[$_carrier]);
}
print " ";
printf (" Prefix
",$this->filters['prefix']);
}
function showCustomerTextBox () {
print "Owner";
$this->showResellerForm('reseller');
}
function showCustomerForm($name='customer_filter') {
}
function showTextBeforeCustomerSelection() {
print "Owner";
}
function getRecord($id) {
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('id' => intval($id));
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'prefix';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getRoutes');
$result = $this->SoapEngine->soapclient->getRoutes($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->routes[0]){
return $result->routes[0];
} else {
return false;
}
}
}
function showRecord($route) {
print "Route ";
printf ("",$_SERVER['PHP_SELF']);
print " ";
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
printf ("
%s
",
$item_name
);
if ($this->Fields[$item]['readonly']) {
printf ("
%s
",
$item,
$route->$item,
$route->$item
);
} else {
if ($item == 'carrier_id') {
printf ("
",$item);
$selected_carrier[$route->$item]='selected';
foreach (array_keys($this->carriers) as $_carrier) {
printf ("%s",$_carrier,$selected_carrier[$_carrier],$this->carriers[$_carrier]);
}
printf ("
");
} else {
printf ("
",
$item,
$route->$item
);
}
}
print "
";
}
printf (" ",$carier->id);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print "
";
print " ";
}
function updateRecord () {
//print "Updating route ...";
if (!$_REQUEST['id_filter']) return;
if (!$route = $this->getRecord($_REQUEST['id_filter'])) {
return false;
}
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
if ($this->Fields[$item]['type'] == 'integer') {
$route->$item = intval($_REQUEST[$var_name]);
} else {
$route->$item = trim($_REQUEST[$var_name]);
}
}
$routes=array($route);
$function=array('commit' => array('name' => 'updateRoutes',
'parameters' => array($routes),
'logs' => array('success' => sprintf('Route %d has been updated',$_REQUEST['id_filter'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
}
class Customers extends Records {
var $children = array();
var $showAddForm = false;
var $sortElements = array(
'changeDate' => 'Change date',
'username' => 'Username',
'firstName' => 'First name',
'lastName' => 'Last name',
'organization' => 'Organization',
'customer' => 'Customer'
);
var $propertiesItems = array('sip_credit' => array('name' => 'Credit for SIP accounts',
'category' => 'credit',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'sip_alias_credit' => array('name' => 'Credit for SIP aliases',
'category' => 'credit',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'enum_range_credit' => array('name' => 'Credit for ENUM ranges',
'category' => 'credit',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'enum_number_credit' => array('name' => 'Credit for ENUM numbers',
'category' => 'credit',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'dns_zone_credit' => array('name' => 'Credit for DNS zones',
'category' => 'credit',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'email_credit' => array('name' => 'Credit for E-mail aliases',
'category' => 'credit',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'pstn_access' => array('name' => 'Access to PSTN',
'category' => 'sip',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'prepaid_changes' => array('name' => 'Prepaid Changes',
'category' => 'sip',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'pstn_changes' => array('name' => 'Pstn Changes',
'category' => 'sip',
'permission' => 'admin',
'resellerMayManageForChildAccounts' => true
),
'payment_processor_class' => array('name' => 'Payment Processor Class',
'category' => 'sip',
'permission' => 'admin'
),
'voicemail_server' => array('name' => 'Voicemail Server Address',
'category' => 'sip',
'permission' => 'customer'
),
'voicemail_access_number' => array('name' => 'Voicemail Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'FUNC_access_number' => array('name' => 'Forwarding Unconditional Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'FNOL_access_number' => array('name' => 'Forwarding Not-Online Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'FNOA_access_number' => array('name' => 'Forwarding Not-Available Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'FBUS_access_number' => array('name' => 'Forwarding On Busy Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'change_privacy_access_number' => array('name' => 'Change privacy Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'check_privacy_access_number' => array('name' => 'Check privacy Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'reject_anonymous_access_number' => array('name' => 'Reject anonymous Access Number',
'category' => 'sip',
'permission' => 'customer'
),
'sip_proxy' => array('name' => 'SIP Proxy Address',
'category' => 'sip',
'permission' => 'customer'
),
'sip_outbound_proxy' => array('name' => 'SIP Client Outbound proxy',
'category' => 'sip',
'permission' => 'customer'
),
'store_clear_text_passwords' => array('name' => 'Store clear text passwords',
'category' => 'sip',
'permission' => 'customer'
),
'xcap_root' => array('name' => 'XCAP Root URL',
'category' => 'sip',
'permission' => 'customer'
),
'absolute_voicemail_uri'=> array('name' => 'Use Absolute Voicemail Uri',
'category' => 'sip',
'permission' => 'customer'
),
'dns_admin_email' => array('name' => 'DNS zones Administrator Email',
'category' => 'dns',
'permission' => 'customer'),
'support_web' => array('name' => 'Support Web Site',
'category' => 'sip',
'permission' => 'customer'
),
'support_email' => array('name' => 'Support Email Address',
'category' => 'sip',
'permission' => 'customer'
),
'billing_email' => array('name' => 'Billing Email Address',
'category' => 'sip',
'permission' => 'customer'
),
'support_company' => array('name' => 'Support Organization',
'category' => 'sip',
'permission' => 'customer'
),
'cdrtool_address' => array('name' => 'CDRTool Address',
'category' => 'sip',
'permission' => 'customer'
),
'sip_settings_page' => array('name' => 'SIP Settings Page',
'category' => 'sip',
'permission' => 'customer'
),
'digest_settings_page' => array('name' => 'Settings Page (Digest Auth)',
'category' => 'sip',
'permission' => 'reseller'
),
'records_per_page' => array('name' => 'Records per page',
'category' => 'web',
'permission' => 'customer'
),
'push_notifications_server' => array('name'=>'Push server public interface',
'category' =>'sip',
'permission' => 'customer'
),
'push_notifications_server_private' => array('name'=>'Push server private interface',
'category' =>'sip',
'permission' => 'customer'
)
);
var $FieldsReadOnly=array(
'id' => array('type'=>'integer'),
'reseller' => array('type'=>'integer')
);
var $Fields=array(
'resellerActive' => array ('type' => 'boolean',
'name' => 'Reseller active',
'adminonly' => true
),
'impersonate' => array('type' =>'integer',
'name' =>'Impersonate'),
'companyCode' => array('type' =>'text',
'name' =>'Company code',
'adminonly' => true
),
'balance' => array('type' => 'float',
'adminonly' => true
),
'credit' => array('type' => 'float',
'adminonly' => true
),
'username' => array('type' =>'text', 'extra_html' => 'readonly autocomplete="off"'
),
'password' => array('type'=>'text',
'name'=>'Password'),
'firstName' => array('type'=>'text',
'name'=>'First name'),
'lastName' => array('type'=>'text',
'name'=>'Last name'),
'organization'=> array('type'=>'text'),
'tel' => array('type'=>'text'),
'fax' => array('type'=>'text'),
'sip' => array('type'=>'text'),
'enum' => array('type'=>'text'),
'mobile' => array('type'=>'text'),
'email' => array('type'=>'text'),
'web' => array('type'=>'text'),
'address' => array('type'=>'textarea'),
'postcode' => array('type'=>'text'),
'city' => array('type'=>'text'),
'state' => array('type'=>'text'),
'country' => array('type'=>'text'),
'timezone' => array('type'=>'text'),
'language' => array('type'=>'text'),
'vatNumber' => array('type'=>'text',
'name'=>'VAT number'),
'bankAccount' => array('type'=>'text',
'name'=>'Bank account'
),
'billingEmail' => array('type'=>'text',
'name'=>'Billing email'
),
'billingAddress' => array('type'=>'textarea',
'name'=>'Billing address'
),
);
var $addFields=array(
'username' => array('type' =>'text'
),
'password' => array('type'=>'text',
'name'=>'Password'),
'firstName' => array('type'=>'text',
'name'=>'First name'),
'lastName' => array('type'=>'text',
'name'=>'Last name'),
'organization'=> array('type'=>'text'),
'tel' => array('type'=>'text'),
'email' => array('type'=>'text'),
'address' => array('type'=>'textarea'),
'postcode' => array('type'=>'text'),
'city' => array('type'=>'text'),
'state' => array('type'=>'text'),
'country' => array('type'=>'text'),
'timezone' => array('type'=>'text')
);
var $states=array(
array("label"=>"", "value"=>"N/A"),
array("label"=>"-- CANADA --", "value"=>"-"),
array("label"=>"Alberta", "value"=>"AB"),
array("label"=>"British Columbia", "value"=>"BC"),
array("label"=>"Manitoba", "value"=>"MB"),
array("label"=>"New Brunswick", "value"=>"NB"),
array("label"=>"Newfoundland/Labrador", "value"=>"NL"),
array("label"=>"Northwest Territory", "value"=>"NT"),
array("label"=>"Nova Scotia", "value"=>"NS"),
array("label"=>"Nunavut", "value"=>"NU"),
array("label"=>"Ontario", "value"=>"ON"),
array("label"=>"Prince Edward Island", "value"=>"PE"),
array("label"=>"Quebec", "value"=>"QC"),
array("label"=>"Saskatchewan", "value"=>"SN"),
array("label"=>"Yukon", "value"=>"YT"),
array("label"=>"---- US -----", "value"=>"-"),
array("label"=>"Alabama", "value"=>"AL"),
array("label"=>"Alaska", "value"=>"AK"),
array("label"=>"American Samoa", "value"=>"AS"),
array("label"=>"Arizona", "value"=>"AZ"),
array("label"=>"Arkansas", "value"=>"AR"),
array("label"=>"California", "value"=>"CA"),
array("label"=>"Canal Zone", "value"=>"CZ"),
array("label"=>"Colorado", "value"=>"CO"),
array("label"=>"Connecticut", "value"=>"CT"),
array("label"=>"Delaware", "value"=>"DE"),
array("label"=>"District of Columbia", "value"=>"DC"),
array("label"=>"Florida", "value"=>"FL"),
array("label"=>"Georgia", "value"=>"GA"),
array("label"=>"Guam", "value"=>"GU"),
array("label"=>"Hawaii", "value"=>"HI"),
array("label"=>"Idaho", "value"=>"ID"),
array("label"=>"Illinois", "value"=>"IL"),
array("label"=>"Indiana", "value"=>"IN"),
array("label"=>"Iowa", "value"=>"IA"),
array("label"=>"Kansas", "value"=>"KS"),
array("label"=>"Kentucky", "value"=>"KY"),
array("label"=>"Louisiana", "value"=>"LA"),
array("label"=>"Maine", "value"=>"ME"),
array("label"=>"Mariana Islands", "value"=>"MP"),
array("label"=>"Maryland", "value"=>"MD"),
array("label"=>"Massachusetts", "value"=>"MA"),
array("label"=>"Michigan", "value"=>"MI"),
array("label"=>"Minnesota", "value"=>"MN"),
array("label"=>"Mississippi", "value"=>"MS"),
array("label"=>"Missouri", "value"=>"MO"),
array("label"=>"Montana", "value"=>"MT"),
array("label"=>"Nebraska", "value"=>"NE"),
array("label"=>"Nevada", "value"=>"NV"),
array("label"=>"New Hampshire", "value"=>"NH"),
array("label"=>"New Jersey", "value"=>"NJ"),
array("label"=>"New Mexico", "value"=>"NM"),
array("label"=>"New York", "value"=>"NY"),
array("label"=>"North Carolina", "value"=>"NC"),
array("label"=>"North Dakota", "value"=>"ND"),
array("label"=>"Ohio", "value"=>"OH"),
array("label"=>"Oklahoma", "value"=>"OK"),
array("label"=>"Oregon", "value"=>"OR"),
array("label"=>"Pennsylvania", "value"=>"PA"),
array("label"=>"Puerto Rico", "value"=>"PR"),
array("label"=>"Rhode Island", "value"=>"RI"),
array("label"=>"South Carolina", "value"=>"SC"),
array("label"=>"South Dakota", "value"=>"SD"),
array("label"=>"Tennessee", "value"=>"TN"),
array("label"=>"Texas", "value"=>"TX"),
array("label"=>"Utah", "value"=>"UT"),
array("label"=>"Vermont", "value"=>"VT"),
array("label"=>"Virgin Islands", "value"=>"VI"),
array("label"=>"Virginia", "value"=>"VA"),
array("label"=>"Washington", "value"=>"WA"),
array("label"=>"West Virginia", "value"=>"WV"),
array("label"=>"Wisconsin", "value"=>"WI"),
array("label"=>"Wyoming", "value"=>"WY"),
array("label"=>"APO", "value"=>"AP"),
array("label"=>"AEO", "value"=>"AE"),
array("label"=>"AAO", "value"=>"AA"),
array("label"=>"FPO", "value"=>"FP")
);
var $countries=array(
array("label"=>"Ascension Island", "value"=>"AC"),
array("label"=>"Afghanistan", "value"=>"AF"),
array("label"=>"Albania", "value"=>"AL"),
array("label"=>"Algeria", "value"=>"DZ"),
array("label"=>"American Samoa", "value"=>"AS"),
array("label"=>"Andorra", "value"=>"AD"),
array("label"=>"Angola", "value"=>"AO"),
array("label"=>"Anguilla", "value"=>"AI"),
array("label"=>"Antarctica", "value"=>"AQ"),
array("label"=>"Antigua And Barbuda", "value"=>"AG"),
array("label"=>"Argentina", "value"=>"AR"),
array("label"=>"Armenia", "value"=>"AM"),
array("label"=>"Aruba", "value"=>"AW"),
array("label"=>"Australia", "value"=>"AU"),
array("label"=>"Austria", "value"=>"AT"),
array("label"=>"Azerbaijan", "value"=>"AZ"),
array("label"=>"Bahamas", "value"=>"BS"),
array("label"=>"Bahrain", "value"=>"BH"),
array("label"=>"Bangladesh", "value"=>"BD"),
array("label"=>"Barbados", "value"=>"BB"),
array("label"=>"Belarus", "value"=>"BY"),
array("label"=>"Belgium", "value"=>"BE"),
array("label"=>"Belize", "value"=>"BZ"),
array("label"=>"Benin", "value"=>"BJ"),
array("label"=>"Bermuda", "value"=>"BM"),
array("label"=>"Bhutan", "value"=>"BT"),
array("label"=>"Bolivia", "value"=>"BO"),
array("label"=>"Bosnia And Herzegowina","value"=>"BA"),
array("label"=>"Botswana", "value"=>"BW"),
array("label"=>"Bouvet Island", "value"=>"BV"),
array("label"=>"Brazil", "value"=>"BR"),
array("label"=>"British Indian Ocean Territory", "value"=>"IO"),
array("label"=>"Brunei Darussalam", "value"=>"BN"),
array("label"=>"Bulgaria", "value"=>"BG"),
array("label"=>"Burkina Faso", "value"=>"BF"),
array("label"=>"Burundi", "value"=>"BI"),
array("label"=>"Cambodia", "value"=>"KH"),
array("label"=>"Cameroon", "value"=>"CM"),
array("label"=>"Canada", "value"=>"CA"),
array("label"=>"Cape Verde", "value"=>"CV"),
array("label"=>"Cayman Islands", "value"=>"KY"),
array("label"=>"Central African Republic", "value"=>"CF"),
array("label"=>"Chad", "value"=>"TD"),
array("label"=>"Chile", "value"=>"CL"),
array("label"=>"China", "value"=>"CN"),
array("label"=>"Christmas Island", "value"=>"CX"),
array("label"=>"Cocos (Keeling) Islands", "value"=>"CC"),
array("label"=>"Colombia", "value"=>"CO"),
array("label"=>"Comoros", "value"=>"KM"),
array("label"=>"Congo", "value"=>"CG"),
array("label"=>"Congo, Democratic People's Republic", "value"=>"CD"),
array("label"=>"Cook Islands", "value"=>"CK"),
array("label"=>"Costa Rica", "value"=>"CR"),
array("label"=>"Cote d'Ivoire", "value"=>"CI"),
array("label"=>"Croatia (local name: Hrvatska)", "value"=>"HR"),
array("label"=>"Cuba", "value"=>"CU"),
array("label"=>"Cyprus", "value"=>"CY"),
array("label"=>"Czech Republic","value"=>"CZ"),
array("label"=>"Denmark", "value"=>"DK"),
array("label"=>"Djibouti", "value"=>"DJ"),
array("label"=>"Dominica", "value"=>"DM"),
array("label"=>"Dominican Republic", "value"=>"DO"),
array("label"=>"East Timor", "value"=>"TP"),
array("label"=>"Ecuador", "value"=>"EC"),
array("label"=>"Egypt", "value"=>"EG"),
array("label"=>"El Salvador", "value"=>"SV"),
array("label"=>"Equatorial Guinea", "value"=>"GQ"),
array("label"=>"Eritrea", "value"=>"ER"),
array("label"=>"Estonia", "value"=>"EE"),
array("label"=>"Ethiopia", "value"=>"ET"),
array("label"=>"Falkland Islands (Malvinas)", "value"=>"FK"),
array("label"=>"Faroe Islands", "value"=>"FO"),
array("label"=>"Fiji", "value"=>"FJ"),
array("label"=>"Finland", "value"=>"FI"),
array("label"=>"France", "value"=>"FR"),
array("label"=>"French Guiana", "value"=>"GF"),
array("label"=>"French Polynesia", "value"=>"PF"),
array("label"=>"French Southern Territories", "value"=>"TF"),
array("label"=>"Gabon", "value"=>"GA"),
array("label"=>"Gambia", "value"=>"GM"),
array("label"=>"Georgia", "value"=>"GE"),
array("label"=>"Germany", "value"=>"DE"),
array("label"=>"Ghana", "value"=>"GH"),
array("label"=>"Gibraltar", "value"=>"GI"),
array("label"=>"Greece", "value"=>"GR"),
array("label"=>"Greenland", "value"=>"GL"),
array("label"=>"Grenada", "value"=>"GD"),
array("label"=>"Guadeloupe", "value"=>"GP"),
array("label"=>"Guam", "value"=>"GU"),
array("label"=>"Guatemala", "value"=>"GT"),
array("label"=>"Guernsey", "value"=>"GG"),
array("label"=>"Guinea", "value"=>"GN"),
array("label"=>"Guinea-Bissau", "value"=>"GW"),
array("label"=>"Guyana", "value"=>"GY"),
array("label"=>"Haiti", "value"=>"HT"),
array("label"=>"Heard And Mc Donald Islands", "value"=>"HM"),
array("label"=>"Honduras", "value"=>"HN"),
array("label"=>"Hong Kong", "value"=>"HK"),
array("label"=>"Hungary", "value"=>"HU"),
array("label"=>"Iceland", "value"=>"IS"),
array("label"=>"India", "value"=>"IN"),
array("label"=>"Indonesia", "value"=>"ID"),
array("label"=>"Iran (Islamic Republic Of)", "value"=>"IR"),
array("label"=>"Iraq", "value"=>"IQ"),
array("label"=>"Ireland", "value"=>"IE"),
array("label"=>"Isle of Man", "value"=>"IM"),
array("label"=>"Israel", "value"=>"IL"),
array("label"=>"Italy", "value"=>"IT"),
array("label"=>"Jamaica", "value"=>"JM"),
array("label"=>"Japan", "value"=>"JP"),
array("label"=>"Jersey", "value"=>"JE"),
array("label"=>"Jordan", "value"=>"JO"),
array("label"=>"Kazakhstan", "value"=>"KZ"),
array("label"=>"Kenya", "value"=>"KE"),
array("label"=>"Kiribati", "value"=>"KI"),
array("label"=>"Korea, Democratic People's Republic Of", "value"=>"KP"),
array("label"=>"Korea, Republic Of", "value"=>"KR"),
array("label"=>"Kuwait", "value"=>"KW"),
array("label"=>"Kyrgyzstan", "value"=>"KG"),
array("label"=>"Lao People's Democratic Republic", "value"=>"LA"),
array("label"=>"Latvia", "value"=>"LV"),
array("label"=>"Lebanon", "value"=>"LB"),
array("label"=>"Lesotho", "value"=>"LS"),
array("label"=>"Liberia", "value"=>"LR"),
array("label"=>"Libyan Arab Jamahiriya", "value"=>"LY"),
array("label"=>"Liechtenstein", "value"=>"LI"),
array("label"=>"Lithuania", "value"=>"LT"),
array("label"=>"Luxembourg", "value"=>"LU"),
array("label"=>"Macau", "value"=>"MO"),
array("label"=>"Macedonia, The Former Yugoslav", "value"=>"MK"),
array("label"=>"Of", "value"=>"Republic"),
array("label"=>"Madagascar", "value"=>"MG"),
array("label"=>"Malawi", "value"=>"MW"),
array("label"=>"Malaysia", "value"=>"MY"),
array("label"=>"Maldives", "value"=>"MV"),
array("label"=>"Mali", "value"=>"ML"),
array("label"=>"Malta", "value"=>"MT"),
array("label"=>"Marshall Islands", "value"=>"MH"),
array("label"=>"Martinique", "value"=>"MQ"),
array("label"=>"Mauritania", "value"=>"MR"),
array("label"=>"Mauritius", "value"=>"MU"),
array("label"=>"Mayotte", "value"=>"YT"),
array("label"=>"Mexico", "value"=>"MX"),
array("label"=>"Micronesia, Federated States Of", "value"=>"FM"),
array("label"=>"Moldova, Republic Of", "value"=>"MD"),
array("label"=>"Monaco", "value"=>"MC"),
array("label"=>"Mongolia", "value"=>"MN"),
array("label"=>"Montserrat", "value"=>"MS"),
array("label"=>"Morocco", "value"=>"MA"),
array("label"=>"Mozambique", "value"=>"MZ"),
array("label"=>"Myanmar", "value"=>"MM"),
array("label"=>"Namibia", "value"=>"NA"),
array("label"=>"Nauru", "value"=>"NR"),
array("label"=>"Nepal", "value"=>"NP"),
array("label"=>"Netherlands", "value"=>"NL"),
array("label"=>"Netherlands Antilles", "value"=>"AN"),
array("label"=>"New Caledonia", "value"=>"NC"),
array("label"=>"New Zealand", "value"=>"NZ"),
array("label"=>"Nicaragua", "value"=>"NI"),
array("label"=>"Niger", "value"=>"NE"),
array("label"=>"Nigeria", "value"=>"NG"),
array("label"=>"Niue", "value"=>"NU"),
array("label"=>"Norfolk Island", "value"=>"NF"),
array("label"=>"Northern Mariana Islands", "value"=>"MP"),
array("label"=>"Norway", "value"=>"NO"),
array("label"=>"Oman", "value"=>"OM"),
array("label"=>"Pakistan", "value"=>"PK"),
array("label"=>"Palau", "value"=>"PW"),
array("label"=>"Palestinian Territories", "value"=>"PS"),
array("label"=>"Panama", "value"=>"PA"),
array("label"=>"Papua New Guinea", "value"=>"PG"),
array("label"=>"Paraguay", "value"=>"PY"),
array("label"=>"Peru", "value"=>"PE"),
array("label"=>"Philippines", "value"=>"PH"),
array("label"=>"Pitcairn", "value"=>"PN"),
array("label"=>"Poland", "value"=>"PL"),
array("label"=>"Portugal", "value"=>"PT"),
array("label"=>"Puerto Rico", "value"=>"PR"),
array("label"=>"Qatar", "value"=>"QA"),
array("label"=>"Reunion", "value"=>"RE"),
array("label"=>"Romania", "value"=>"RO"),
array("label"=>"Russian Federation", "value"=>"RU"),
array("label"=>"Rwanda", "value"=>"RW"),
array("label"=>"Saint Kitts And Nevis", "value"=>"KN"),
array("label"=>"Saint Lucia", "value"=>"LC"),
array("label"=>"Saint Vincent And The Grenadines", "value"=>"VC"),
array("label"=>"Samoa", "value"=>"WS"),
array("label"=>"San Marino", "value"=>"SM"),
array("label"=>"Sao Tome And Principe", "value"=>"ST"),
array("label"=>"Saudi Arabia", "value"=>"SA"),
array("label"=>"Senegal", "value"=>"SN"),
array("label"=>"Seychelles", "value"=>"SC"),
array("label"=>"Sierra Leone", "value"=>"SL"),
array("label"=>"Singapore", "value"=>"SG"),
array("label"=>"Slovakia (Slovak Republic)", "value"=>"SK"),
array("label"=>"Slovenia", "value"=>"SI"),
array("label"=>"Solomon Islands", "value"=>"SB"),
array("label"=>"Somalia", "value"=>"SO"),
array("label"=>"South Africa", "value"=>"ZA"),
array("label"=>"South Georgia And South Sandwich", "value"=>"GS"),
array("label"=>"Spain", "value"=>"ES"),
array("label"=>"Sri Lanka", "value"=>"LK"),
array("label"=>"St. Helena", "value"=>"SH"),
array("label"=>"St. Pierre And Miquelon", "value"=>"PM"),
array("label"=>"Sudan", "value"=>"SD"),
array("label"=>"Suriname", "value"=>"SR"),
array("label"=>"Svalbard And Jan Mayen Islands", "value"=>"SJ"),
array("label"=>"Swaziland", "value"=>"SZ"),
array("label"=>"Sweden", "value"=>"SE"),
array("label"=>"Switzerland", "value"=>"CH"),
array("label"=>"Syrian Arab Republic", "value"=>"SY"),
array("label"=>"Taiwan, Province Of China", "value"=>"TW"),
array("label"=>"Tajikistan", "value"=>"TJ"),
array("label"=>"Tanzania, United Republic Of", "value"=>"TZ"),
array("label"=>"Thailand", "value"=>"TH"),
array("label"=>"Togo", "value"=>"TG"),
array("label"=>"Tokelau", "value"=>"TK"),
array("label"=>"Tonga", "value"=>"TO"),
array("label"=>"Trinidad And Tobago", "value"=>"TT"),
array("label"=>"Tunisia", "value"=>"TN"),
array("label"=>"Turkey", "value"=>"TR"),
array("label"=>"Turkmenistan", "value"=>"TM"),
array("label"=>"Turks And Caicos Islands", "value"=>"TC"),
array("label"=>"Tuvalu", "value"=>"TV"),
array("label"=>"Uganda", "value"=>"UG"),
array("label"=>"Ukraine", "value"=>"UA"),
array("label"=>"United Arab Emirates", "value"=>"AE"),
array("label"=>"United Kingdom", "value"=>"UK"),
array("label"=>"United States", "value"=>"US"),
array("label"=>"United States Minor Outlying Islands", "value"=>"UM"),
array("label"=>"Uruguay", "value"=>"UY"),
array("label"=>"Uzbekistan", "value"=>"UZ"),
array("label"=>"Vanuatu", "value"=>"VU"),
array("label"=>"Vatican City State (Holy See)", "value"=>"VA"),
array("label"=>"Venezuela", "value"=>"VE"),
array("label"=>"Viet Nam", "value"=>"VN"),
array("label"=>"Virgin Islands (British)", "value"=>"VG"),
array("label"=>"Virgin Islands (U.S.)", "value"=>"VI"),
array("label"=>"Wallis And Futuna Islands", "value"=>"WF"),
array("label"=>"Western Sahara", "value"=>"EH"),
array("label"=>"Yemen", "value"=>"YE"),
array("label"=>"Yugoslavia", "value"=>"YU"),
array("label"=>"Zaire", "value"=>"ZR"),
array("label"=>"Zambia", "value"=>"ZM"),
array("label"=>"Zimbabwe", "value"=>"ZW"),
array("label"=>"Undefined", "value"=>"N/A")
);
var $hide_html = false;
function Customers($SoapEngine) {
dprint("init Customers");
$this->filters = array(
'username' => trim($_REQUEST['username_filter']),
'firstName' => trim($_REQUEST['firstName_filter']),
'lastName' => trim($_REQUEST['lastName_filter']),
'organization' => trim($_REQUEST['organization_filter']),
'tel' => trim($_REQUEST['tel_filter']),
'email' => trim($_REQUEST['email_filter']),
'web' => trim($_REQUEST['web_filter']),
'country' => trim($_REQUEST['country_filter']),
'city' => trim($_REQUEST['city_filter']),
'only_resellers' => trim($_REQUEST['only_resellers_filter'])
);
$this->Records($SoapEngine);
$this->showAddForm = $_REQUEST['showAddForm'];
if (is_array($this->SoapEngine->customer_properties)) {
$this->customer_properties = $this->SoapEngine->customer_properties;
} else {
$this->customer_properties = array();
}
$this->allProperties=array_merge($this->propertiesItems,$this->customer_properties);
}
function showSeachForm() {
printf ("
%s ",
$this->SoapEngine->ports[$this->SoapEngine->port]['description'],
'%'
);
printf ("
",$_SERVER['PHP_SELF']);
print "
";
print "
";
print "
Search ";
$this->showEngineSelection();
print "
";
$this->showSortForm();
print "
Id ";
$this->showCustomerSelection();
$this->showResellerSelection();
print "
";
$this->showSeachFormCustom();
$this->printHiddenFormElements('skipServiceElement');
print "
";
}
function listRecords() {
// Filter
$filter=array('username' => $this->filters['username'],
'firstName' => $this->filters['firstName'],
'lastName' => $this->filters['lastName'],
'organization' => $this->filters['organization'],
'tel' => $this->filters['tel'],
'email' => $this->filters['email'],
'web' => $this->filters['web'],
'city' => $this->filters['city'],
'country' => $this->filters['country'],
'only_resellers' => $this->filters['only_resellers'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
//print_r($filter);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->showSeachForm();
if ($this->showAddForm) {
$this->showAddForm();
return true;
}
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
if ($this->adminonly && $this->filters['only_resellers']) {
$this->log_action('getResellers');
$result = $this->SoapEngine->soapclient->getResellers($Query);
} else {
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
}
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found. Click on the id to edit the account.
";
print "
";
$_add_url = $this->url.sprintf("&service=%s&showAddForm=1",
urlencode($this->SoapEngine->service)
);
printf ("
Add new account ",$_add_url);
if ($this->adminonly) {
if ($this->adminonly && $this->filters['reseller']) {
$_add_url = $this->url.sprintf("&service=%s&showAddForm=1&reseller_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($this->filters['reseller'])
);
printf ("
Add a new account for reseller %s ",$_add_url,$this->filters['reseller']);
}
}
print "
";
if ($this->rows > 1) {
print "
Id
Impersonate
Username
Name
Organization
Country
E-mail
Phone number
Change date
Actions
";
}
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows > 1) {
while ($i < $maxrows) {
if (!$result->accounts[$i]) break;
$customer = $result->accounts[$i];
$index = $this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&reseller_filter=%s&customer_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($customer->reseller),
urlencode($customer->id)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['customer_filter'] == $customer->id) {
$_url .= "&confirm=1";
$actionText = "Confirm ";
} else {
$actionText = "Delete";
}
$_customer_url = $this->url.sprintf("&service=%s&reseller_filter=%s&customer_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($customer->reseller),
urlencode($customer->id)
);
printf("
%s
%s.%s
%s
%s
%s %s
%s
%s
%s
%s
%s
%s
",
$index,
$_customer_url,
$customer->id,
$customer->reseller,
$customer->impersonate,
strip_tags($customer->username),
strip_tags($customer->firstName),
strip_tags($customer->lastName),
strip_tags($customer->organization),
strip_tags($customer->country),
strip_tags($customer->email),
strip_tags($customer->email),
$customer->tel,
$customer->changeDate,
$_url,
$actionText
);
$this->showExtraActions($customer);
print "
";
$i++;
}
}
print "
";
if ($this->rows == 1 ) {
$customer = $result->accounts[0];
$this->showRecord($customer);
}
$this->showPagination($maxrows);
return true;
}
}
function showSeachFormCustom() {
printf (" Username
",$this->filters['username']);
printf (" FN
\n",$this->filters['firstName']);
printf (" LN
\n",$this->filters['lastName']);
printf (" Organization
\n",$this->filters['organization']);
printf (" Email
\n",$this->filters['email']);
if ($this->adminonly) {
if ($this->filters['only_resellers']) $check_only_resellers_filter='checked';
printf (" Resellers ",$check_only_resellers_filter);
}
}
function deleteRecord($dictionary= Array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['customer']) {
$customer=$dictionary['customer'];
} else {
$customer=$this->filters['customer'];
}
if (!strlen($customer)) {
print "
Error: missing customer id. ";
return false;
}
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array(intval($customer)),
'logs' => array('success' => sprintf('Customer id %s has been deleted',$this->filters['customer'])))
);
if ($this->SoapEngine->execute($function,$this->html)) {
unset($this->filters);
return true;
} else {
return false;
}
}
function getRecord($id) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount(intval($id));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return $result;
}
}
function showRecordHeader($customer) {
}
function showRecordFooter($customer) {
}
function showExtraActions($customer) {
}
function showRecord($customer) {
//dprint_r($customer);
$this->showRecordHeader($customer);
print "
";
printf ("",$_SERVER['PHP_SELF']);
print "
";
if ($_REQUEST['action'] != 'Delete' && $_REQUEST['action'] != 'Copy') {
print " ";
printf (" E-mail account information");
}
print "
";
printf (" ",$customer->id);
if ($this->adminonly) {
printf (" ",$customer->reseller);
}
if ($this->adminonly || $this->reseller == $customer->reseller) {
if ($_REQUEST['action'] != 'Delete') {
print " ";
}
print "
";
if ($_REQUEST['action'] == 'Delete' || $_REQUEST['action'] == 'Copy') {
print " ";
}
}
print "
";
print "
";
printf ("
Property
Value
");
foreach (array_keys($this->FieldsReadOnly) as $item) {
printf ("
%s
%s
",
ucfirst($item),
$customer->$item
);
}
foreach (array_keys($this->Fields) as $item) {
if ($this->Fields[$item]['name']) {
$item_name=$this->Fields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
if ($item=='timezone') {
printf ("
%s ",
$item_name
);
print "";
$this->showTimezones($customer->$item);
print "
";
} else if ($item=='state') {
printf ("
%s ",
$item_name
);
print "
";
$selected_state[$customer->state]='selected';
foreach ($this->states as $_state) {
printf ("%s",$_state['value'],$selected_state[$_state['value']],$_state['label']);
}
print "
";
} else if ($item=='country') {
printf ("
%s ",
$item_name
);
print "
";
$selected_country[$customer->country]='selected';
foreach ($this->countries as $_country) {
printf ("%s",$_country['value'],$selected_country[$_country['value']],$_country['label']);
}
print "
";
} else if ($item=='resellerActive' && ($customer->reseller != $customer->id)) {
printf (" ",
$item,
$customer->$item);
} else if ($item=='impersonate') {
if ($customer->reseller != $customer->id) {
if ($this->adminonly || $this->customer == $customer->reseller) {
printf ("
%s ",
$item_name
);
print " ";
$this->getChildren($customer->reseller);
if (count($this->children)> 0) {
print "
";
$selected_impersonate[$customer->impersonate]='selected';
foreach (array_keys($this->children) as $_child) {
printf (" %s. %s %s",$_child,$selected_impersonate[$_child],$_child,$this->children[$_child]['firstName'],$this->children[$_child]['lastName']);
}
print "
";
} else {
printf ("
",
$item,
$customer->$item
);
}
print "
";
} else {
printf ("
%s
%s
",
$item_name,
$item,
$customer->$item,
$customer->$item
);
}
} else {
printf ("
",
$item,
$customer->$item
);
}
} else {
if ($this->Fields[$item]['type'] == 'textarea') {
printf ("
%s
%s
",
$item_name,
$item,
$customer->$item
);
} elseif ($this->Fields[$item]['type'] == 'boolean') {
if ($this->Fields[$item]['adminonly'] && !$this->adminonly) {
printf ("
%s
%s
",
$item_name,
$item,
$customer->$item,
$customer->$item
);
} else {
$_var='select_'.$item;
${$_var}[$customer->$item]='selected';
printf ("
%s
False
True
",
$item_name,
$item,
${$_var}[0],
${$_var}[1]
);
}
} else {
if ($this->Fields[$item]['adminonly'] && !$this->adminonly) {
printf ("
%s
%s
",
$item_name,
$item,
$customer->$item,
$customer->$item
);
} else {
printf ("
%s
",
$item_name,
$item,
$customer->$item,
$this->Fields[$item]['extra_html']
);
}
}
}
}
$this->printFiltersToForm();
$this->printHiddenFormElements();
//print "";
print "
";
/*
print "";
print_r($customer);
print " ";
*/
print "
";
/*
print "";
print_r($this->login_credentials);
print " ";
*/
print "
";
if ($this->login_credentials['login_type'] == 'admin') {
printf ("
Category
Level
Property
Value
Description
");
} else if ($this->login_credentials['login_type'] == 'reseller') {
printf ("
Level
Property
Value
"
);
} else {
printf ("
Property
Value
"
);
}
foreach ($customer->properties as $_property) {
if (in_array($_property->name,array_keys($this->allProperties))) {
$this->allProperties[$_property->name]['value']=$_property->value;
}
}
foreach (array_keys($this->allProperties) as $item) {
$item_print=preg_replace("/_/"," ",$item);
$_permission=$this->allProperties[$item]['permission'];
if ($this->login_credentials['login_type'] == 'admin') {
if ($this->allProperties[$item]['permission'] == 'admin' &&
$customer->id != $customer->reseller &&
$this->allProperties[$item]['resellerMayManageForChildAccounts']) {
$_permission='reseller';
}
printf ("
%s
%s
%s
%s
",
$this->allProperties[$item]['category'],
ucfirst($_permission),
$item_print,
$item,
$this->allProperties[$item]['value'],
$this->allProperties[$item]['name']
);
} else if ($this->login_credentials['login_type'] == 'reseller') {
// logged in as reseller
if ($this->allProperties[$item]['permission'] == 'admin') {
if ($customer->id == $customer->reseller ) {
// reseller cannot modify himself for items with admin permission
if (!$this->allProperties[$item]['invisible']) {
printf ("
%s
%s
%s
",
ucfirst($this->allProperties[$item]['permission']),
$this->allProperties[$item]['name'],
$this->allProperties[$item]['value']
);
}
} else {
if ($this->allProperties[$item]['resellerMayManageForChildAccounts']) {
// reseller can manage these properties for his customers
printf ("
%s
%s
",
'Reseller',
$this->allProperties[$item]['name'],
$item,
$this->allProperties[$item]['value']
);
} else {
if (!$this->allProperties[$item]['invisible']) {
// otherwise cannot modify them
printf ("
%s
%s
%s
",
ucfirst($this->allProperties[$item]['permission']),
$this->allProperties[$item]['name'],
$this->allProperties[$item]['value']
);
}
}
}
} else {
printf ("
%s
%s
",
ucfirst($this->allProperties[$item]['permission']),
$this->allProperties[$item]['name'],
$item,
$this->allProperties[$item]['value']
);
}
} else {
// logged in as customer
if ($this->allProperties[$item]['permission'] == 'admin' || $this->allProperties[$item]['permission'] == 'reseller' ) {
if (!$this->allProperties[$item]['invisible']) {
printf ("
%s
%s
",
$this->allProperties[$item]['name'],
$this->allProperties[$item]['value']
);
}
} else {
printf ("
%s
",
$this->allProperties[$item]['name'],
$item,
$this->allProperties[$item]['value']
);
}
}
}
print "
";
$this->printFiltersToForm();
$this->printHiddenFormElements();
print "";
print "
";
$this->showRecordFooter($customer);
}
function updateRecord () {
//print "Updating customer ...";
if (!strlen($this->filters['customer'])) {
return false;
}
if (!$customer=$this->getRecord($this->filters['customer'])) {
return false;
}
if ($_REQUEST['notify']) {
$customer_notify=array('firstName'=> $customer->firstName,
'lastName' => $customer->lastName,
'email' => $customer->email,
'username' => $customer->username,
'password' => $customer->password
);
if ($this->notify($customer_notify)) {
print "
";
printf (_("The login account details have been sent to %s"), $customer->email);
return true;
} else {
print "
";
printf (_("Error sending e-mail notification"));
return false;
}
}
if (!$this->updateBefore($customer)) {
return false;
}
$customer->credit = floatval($customer->credit);
$customer->balance = floatval($customer->balance);
foreach ($customer->properties as $_property) {
$properties[]=$_property;
}
if (is_array($properties)) {
$customer->properties=$properties;
} else {
$customer->properties=array();
}
$customer_old = $customer;
// update properties
foreach (array_keys($this->allProperties) as $item) {
$var_name = $item.'_form';
$updated_property=array();
foreach (array_keys($customer->properties) as $_key) {
$_property=$customer->properties[$_key];
if ($_property->name == $item) {
// update property
if ($_property->permission == 'admin') {
if ($this->login_credentials['login_type'] == 'admin') {
$customer->properties[$_key]->value=trim($_REQUEST[$var_name]);
} else if ($this->login_credentials['login_type'] == 'reseller' && $this->allProperties[$item]['resellerMayManageForChildAccounts']) {
if ($customer->id != $customer->reseller) {
$customer->properties[$_key]->value=trim($_REQUEST[$var_name]);
}
}
} else if ($_property->permission == 'reseller') {
if ($this->login_credentials['login_type'] == 'admin' || $this->login_credentials['login_type'] == 'reseller') {
$customer->properties[$_key]->value=trim($_REQUEST[$var_name]);
}
} else {
$customer->properties[$_key]->value=trim($_REQUEST[$var_name]);
if ($_key == 'yubikey' && $_REQUEST[$var_name] != '') {
$customer->properties[$_key]->value = substr($customer->properties[$_key]->value,0,12);
}
}
$updated_property[$item]++;
break;
}
}
if (!$updated_property[$item] && strlen($_REQUEST[$var_name])) {
// add new property
unset($var_value);
unset($_permission);
if ($this->allProperties[$item]['permission'] == 'admin') {
$_permission = 'admin';
if ($this->login_credentials['login_type'] == 'admin') {
$var_value = trim($_REQUEST[$var_name]);
} else if ($this->login_credentials['login_type'] == 'reseller' && $this->allProperties[$item]['resellerMayManageForChildAccounts']) {
if ($customer->id != $customer->reseller) {
$var_value = trim($_REQUEST[$var_name]);
}
}
} else if ($this->allProperties[$item]['permission'] == 'reseller') {
$_permission = 'reseller';
if ($this->login_credentials['login_type'] == 'admin' || $this->login_credentials['login_type'] == 'reseller') {
$var_value = trim($_REQUEST[$var_name]);
}
} else {
$_permission = 'customer';
$var_value = trim($_REQUEST[$var_name]);
}
if (strlen($var_value)) {
if ($item == 'yubikey' ) {
$var_value = substr($var_value,0,12);
}
$customer->properties[] = array('name' => $item,
'value' => $var_value,
'category' => $this->allProperties[$item]['category'],
'permission' => $this->allProperties[$item]['permission']
);
}
}
}
/*
print "
";
print_r($customer->properties);
print " ";
*/
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer' || $this->Fields[$item]['type'] == 'boolean') {
$customer->$item = intval($_REQUEST[$var_name]);
} else if ($this->Fields[$item]['type'] == 'float') {
$customer->$item = floatval($_REQUEST[$var_name]);
} else {
$customer->$item = strip_tags(trim($_REQUEST[$var_name]));
}
}
$customer->tel = preg_replace("/[^\+0-9]/","",$customer->tel);
$customer->fax = preg_replace("/[^\+0-9]/","",$customer->fax);
$customer->enum = preg_replace("/[^\+0-9]/","",$customer->enum);
if (!strlen($_REQUEST['password_form'])) $customer->password = $this->RandomString(6);
if (!strlen($_REQUEST['state_form'])) $customer->state = 'N/A';
if (!strlen($_REQUEST['country_form'])) $customer->country = 'N/A';
if (!strlen($_REQUEST['city_form'])) $customer->city = 'Unknown';
if (!strlen($_REQUEST['address_form'])) $customer->address = 'Unknown';
if (!strlen($_REQUEST['postcode_form'])) $customer->postcode = 'Unknown';
if (!strlen($_REQUEST['tel_form'])) $customer->tel = '+19999999999';
if ($customer->reseller != $customer->id) {
// a subaccount cannot change his own impersonate field
if (!$this->adminonly) {
if ($this->customer != $customer->reseller) {
$customer->impersonate=$customer_old->impersonate;
}
}
}
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($customer),
'logs' => array('success' => sprintf('Customer id %s has been updated',$customer->id)))
);
//dprint_r($customer);
if ($this->SoapEngine->execute($function,$this->html,$this->adminonly)) {
$this->updateAfter($customer,$customer_old);
return true;
} else {
return false;
}
}
function showTimezones($timezone) {
if (!$fp = fopen("timezones", "r")) {
print _("Failed to open timezone file.");
return false;
}
print "";
print "\n";
while ($buffer = fgets($fp,1024)) {
$buffer=trim($buffer);
if ($timezone==$buffer) {
$selected="selected";
} else {
$selected="";
}
print "\n ";
print "$buffer";
}
fclose($fp);
print " ";
}
function getChildren($reseller) {
return;
// Filter
$filter=array('reseller' => intval($reseller));
// Range
$range=array('start' => 0,
'count' => 1000
);
// Order
$orderBy = array('attribute' => 'firstName',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getCustomers');
// Call function
$result = $this->SoapEngine->soapclient->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$i=0;
if ($result->total > 100) return;
while ($i < $result->total) {
$customer = $result->accounts[$i];
$this->children[$customer->id]=array('firstName' => $customer->firstName,
'lastName' => $customer->lastName,
'organization' => $customer->organization
);
$i++;
}
}
}
function copyRecord () {
//print "Copy customer ...";
if (!strlen($this->filters['customer'])) {
return false;
}
if (!$_REQUEST['confirm']) {
print "
Please press on Copy again to confirm the copy ";
return true;
}
if (!$customer=$this->getRecord($this->filters['customer'])) {
return false;
}
$customer->credit = floatval($customer->credit);
$customer->balance = floatval($customer->balance);
foreach ($customer->properties as $_property) {
$properties[]=$_property;
}
if (is_array($properties)) {
$customer->properties=$properties;
} else {
$customer->properties=array();
}
// change username
$customer_new=$customer;
unset($customer_new->id);
$j=1;
while ($j < 9) {
$customer_new->username=$customer->username.$j;
$function=array('commit' => array('name' => 'addAccount',
'parameters' => array($customer_new),
'logs' => array('success' => sprintf('Customer id %s has been copied',$customer->id)))
);
if ($this->SoapEngine->execute($function,$this->html)) {
// Reset filters to find the copy
$this->filters=array();
$this->filters['username']=$customer_new->username;
return true;
} else {
if ($this->SoapEngine->error_fault->detail->exception->errorcode != "5001") {
return false;
}
}
$j++;
}
}
function showAddForm($confirmPassword=false) {
print "
";
print "
";
print _("Accounts are used for login and to assign ownership to data created in the platform. ");
printf ("
",$_SERVER['PHP_SELF']);
print "
";
if ($this->adminonly && $this->filters['reseller']) {
printf ("
Reseller
%s ",$this->filters['reseller']);
printf (" ",$this->filters['reseller']);
} else if ($this->reseller) {
printf ("Reseller
%s ",$this->reseller);
}
foreach (array_keys($this->addFields) as $item) {
if ($this->addFields[$item]['name']) {
$item_name=$this->addFields[$item]['name'];
} else {
$item_name=ucfirst($item);
}
$item_form=$item.'_form';
if ($item=='timezone') {
$_value=$_REQUEST['timezone_form'];
if (!$_value) {
if ($this->SoapEngine->default_timezone) {
$_value=$this->SoapEngine->default_timezone;
} else {
$_value='Europe/Amsterdam';
}
}
printf ("
%s",
$item_name
);
print "
";
$this->showTimezones($_value);
print "
";
} else if ($item=='state') {
printf ("
%s
",
$item_name
);
print "
";
$selected_state[$_REQUEST[$item_form]]='selected';
foreach ($this->states as $_state) {
printf ("%s",$_state['value'],$selected_state[$_state['value']],$_state['label']);
}
print "
";
} else if ($item=='country') {
printf ("
%s
",
$item_name
);
print "
";
if (!$_REQUEST[$item_form]) {
if ($this->SoapEngine->default_country) {
$_value=$this->SoapEngine->default_country;
} else {
$_value='NL';
}
} else {
$_value=$_REQUEST[$item_form];
}
$selected_country[$_value]='selected';
foreach ($this->countries as $_country) {
printf ("%s",$_country['value'],$selected_country[$_country['value']],$_country['label']);
}
print "
";
} else {
if ($this->addFields[$item]['type'] == 'textarea') {
printf ("
",
$item_name,
$item,
$_REQUEST[$item_form]
);
} elseif ($this->addFields[$item]['type'] == 'boolean') {
$_var='select_'.$item;
${$_var}[$_REQUEST[$item_form]]='selected';
printf ("
%s
False
True
",
$item_name,
$item,
${$_var}[0],
${$_var}[1]
);
} else {
$type='text';
if (strstr($item,'password')) $type='password';
printf ("
",
$item_name,
$item,
$type,
$_REQUEST[$item_form]
);
if ($item=='password' && $confirmPassword) {
printf ("
",
$_REQUEST[confirm_password_form]
);
}
}
}
}
if ($_REQUEST['notify']) $checked_notify='checked';
printf ("
",$checked_notify);
$this->printHiddenFormElements();
print "
";
print "
";
}
function addRecord($dictionary=array(),$confirmPassword=false) {
if (!$this->checkRecord($dictionary)) {
return false;
}
foreach (array_keys($this->addFields) as $item) {
if ($dictionary[$item]) {
$customer[$item] = strip_tags(trim($dictionary[$item]));
} else {
$item_form = $item.'_form';
$customer[$item] = strip_tags(trim($_REQUEST[$item_form]));
}
}
if (!strlen($customer['username'])) $customer['username'] = trim($customer['firstName']).'.'.trim($customer['lastName'].$this->RandomNumber(5));
if (!strlen($customer['state'])) $customer['state'] = 'N/A';
if (!strlen($customer['country'])) $customer['country'] = 'N/A';
if (!strlen($customer['city'])) $customer['city'] = 'Unknown';
if (!strlen($customer['address'])) $customer['address'] = 'Unknown';
if (!strlen($customer['postcode'])) $customer['postcode'] = 'Unknown';
if (!strlen($customer['timezone'])) $customer['timezone'] = 'Europe/Amsterdam';
if ($dictionary['reseller']) {
$customer['reseller']=intval($dictionary['reseller']);
} else if ($this->adminonly && $this->filters['reseller']) {
$customer['reseller']=intval($this->filters['reseller']);
}
$customer['username'] = strtolower(preg_replace ("/\s+/",".",trim($customer['username'])));
$customer['username'] = preg_replace ("/\.{2,}/",".",$customer['username']);
if ($customer['state'] != 'N/A') {
$_state=$customer['state'].' ';
} else {
$_state='';
}
if (!strlen($customer['tel'])){
$customer['tel'] = '+19999999999';
} else {
$customer['tel'] = preg_replace("/[^0-9\+]/","",$customer['tel']);
if (preg_match("/^00(\d{1,20})$/",$customer['tel'],$m)) {
$customer['tel'] = "+".$m[1];
}
}
$customer['billingEmail'] = $customer['email'];
if ($customer['address'] != 'Unknown') {
$customer['billingAddress'] = $customer['address']."\n".
$customer['postcode']." ".$customer['city']."\n".
$_state.$customer['country']."\n";
}
if ($confirmPassword) {
if (!strlen($customer['password'])) {
$this->errorMessage='Password cannot be empty';
return false;
} else if ($customer['password'] != $_REQUEST['confirm_password_form']) {
$this->errorMessage='Password is not confirmed';
return false;
}
}
if (!strlen($customer['password'])) $customer['password'] = $this->RandomString(6);
if (is_array($dictionary['properties'])) {
$customer['properties']=$dictionary['properties'];
} else {
$customer['properties']=array();
}
if ($this->hide_html) {
$logs = array();
} else {
$logs = array('success' => sprintf('Customer entry %s %s has been created',$customer['firstName'],$customer['lastName']));
}
$function=array('commit' => array('name' => 'addAccount',
'parameters' => array($customer),
'logs' => $logs
)
);
if ($result = $this->SoapEngine->execute($function,$this->html)) {
// We have succesfully added customer entry
$this->showAddForm=false;
if ($dictionary['notify'] || $_REQUEST['notify']) $this->notify($customer);
return $result;
} else {
return false;
}
}
function notify($customer) {
/*
must be supplied with an array:
$customer=array('firstName' => ''
'lastName' => '',
'email' => '',
'username' => '',
'password' => ''
);
*/
if ($this->support_web) {
$url=$this->support_web;
} else {
if ($_SERVER['HTTPS']=="on") {
$protocolURL="https://";
} else {
$protocolURL="http://";
}
$url=sprintf("%s%s",$protocolURL,$_SERVER['HTTP_HOST']);
}
$body=
sprintf("Dear %s,\n\n",$customer['firstName']).
sprintf("This e-mail message is for your record. You have registered a login account at %s as follows:\n\n",$url).
sprintf("Username: %s\n",$customer['username']).
sprintf("Password: %s\n",$customer['password']).
"\n".
sprintf("The registration has been performed from the IP address %s.",$_SERVER['REMOTE_ADDR']).
"\n".
"\n".
sprintf("This message was sent in clear text over the Internet and it is advisable, in order to protect your account, to login and change your password displayed in this message. ").
"\n".
"\n".
"This is an automatic message, do not reply.\n";
$from = sprintf("From: %s",$this->support_email);
$subject = sprintf("Your account at %s",$url);
return mail($customer['email'], $subject, $body, $from);
}
function getRecordKeys() {
// Filter
$filter=array('username' => $this->filters['username'],
'firstName' => $this->filters['firstName'],
'lastName' => $this->filters['lastName'],
'organization' => $this->filters['organization'],
'tel' => $this->filters['tel'],
'email' => $this->filters['email'],
'web' => $this->filters['web'],
'city' => $this->filters['city'],
'country' => $this->filters['country'],
'only_resellers' => $this->filters['only_resellers'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 1000
);
// Order
$orderBy = array('attribute' => 'customer',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
if ($this->adminonly && $this->filters['only_resellers']) {
$this->log_action('getResellers');
$result = $this->SoapEngine->soapclient->getResellers($Query);
} else {
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
}
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->accounts as $customer) {
$this->selectionKeys[]=$customer->id;
}
}
}
function getProperty($customer,$name) {
foreach ($customer->properties as $_property) {
if ($_property->name == $name) {
return $_property->value;
}
}
return false;
}
function getCustomerId($username) {
if (!strlen($username)) return false;
$filter = array('username' => $username);
$range = array('start' => 0,'count' => 1);
$orderBy = array('attribute' => 'customer', 'direction' => 'ASC');
$Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if (count($result->accounts) == 1) {
return $result->accounts[0]->id;
} else {
return false;
}
}
}
function getCustomer($username) {
if (!strlen($username)) {
return false;
}
$filter = array('username' => $username);
$range = array('start' => 0,'count' => 1);
$orderBy = array('attribute' => 'customer', 'direction' => 'ASC');
$Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if (count($result->accounts) == 1) {
return $result->accounts[0];
} else {
return false;
}
}
}
function setInitialCredits($credits=array()) {
$properties=array();
foreach (array_keys($credits) as $item) {
if ($this->allProperties[$item]['category'] != 'credit') continue;
$properties[] = array('name' => $item,
'value' => "$credits[$item]",
'category' => $this->allProperties[$item]['category'],
'permission' => $this->allProperties[$item]['permission']
);
}
return $properties;
}
function showVcard($vcardDictionary) {
#http://www.stab.nu/vcard/
# This file will return an vCard Version 3.0 Compliant file to the user. Observe that you should set up #
# your web-server with the correct MIME-type. The reason to use the \r\n as breakes is because it should be #
# more compatible with MS Outlook. All other, better coded, clients sholdnt have any problems with this. #
# #
# Version 1.0 (2003-08-29) #
# #
# Author: Alf Lovbo #
# #
# This document is released under the GNU General Public License. #
# #
#############################################################################################################
# #
# USAGE #
# ----- #
# The following variables can be used togheter with this document for accessing the functions supplied. All #
# of the functions listed below takes an value described by the comment after the |-symbol. #
# #
# $vcard_birtda | Birthday YYYY-MM-DD $vcard_f_name | Family name #
# $vcard_cellul | Cellular Phone Number $vcard_compan | Company Name #
# $vcard_h_addr | Street Address (home) $vcard_h_city | City (home) #
# $vcard_h_coun | Country (home) $vcard_h_fax | Fax (home) #
# $vcard_h_mail | E-mail (home) $vcard_h_phon | Phone (home) #
# $vcard_h_zip | Zip-code (home) $vcard_nickna | Nickname #
# $vcard_note | Note $vcard_s_name | Given name #
# $vcard_uri | Homepage, URL $vcard_w_addr | Street Address (work) #
# $vcard_w_city | City (work) $vcard_w_coun | Country (work) #
# $vcard_w_fax | Fax (work) $vcard_w_mail | E-mail (work) #
# $vcard_w_phon | Phone (work) $vcard_w_role | Function (work) #
# $vcard_w_titl | Title (work) $vcard_w_zip | Zip-code (work) #
# #
#############################################################################################################
# You dont need to change anything below this comment. #
#############################################################################################################
/*
$vcardDictionary=array(
"vcard_nickna" => $this->username,
"vcard_f_name" => $this->lastname,
"vcard_s_name" => $this->firstname,
"vcard_compan" => $this->organization,
"vcard_w_addr" => $this->address,
"vcard_w_zip" => $this->postcode,
"vcard_w_city" => $this->city,
"vcard_w_state" => $this->county,
"vcard_w_coun" => $this->country,
"vcard_w_mail" => $this->email,
"vcard_w_phon" => $this->tel,
"vcard_w_fax" => $this->fax,
"vcard_enum" => $this->enum,
"vcard_sip" => $this->sip,
"vcard_uri" => $this->web,
"vcard_cellul" => $this->mobile
);
*/
foreach (array_keys($vcardDictionary) as $field) {
$value=$vcardDictionary[$field];
${$field}=$value;
}
if ($vcard_w_state=="N/A") $vcard_w_state=" ";
$vcard_w_addr = preg_replace("/[\n|\r]/"," ",$vcard_w_addr);
$vcard_sortst = $vcard_f_name;
$vcard_tz = date("O");
$vcard_rev = date("Y-m-d");
$vcard = "BEGIN:VCARD\r\n";
$vcard .= "VERSION:3.0\r\n";
$vcard .= "CLASS:PUBLIC\r\n";
$vcard .= "PRODID:-//PHP vCard Class//NONSGML Version 1//SE\r\n";
$vcard .= "REV:" . $vcard_rev . "\r\n";
$vcard .= "TZ:" . $vcard_tz . "\r\n";
if ($vcard_f_name != ""){
if ($vcard_s_name != ""){
$vcard .= "FN:" . $vcard_s_name . " " . $vcard_f_name . "\r\n";
$vcard .= "N:" . $vcard_f_name . ";" . $vcard_s_name . "\r\n";
}
else {
$vcard .= "FN:" . $vcard_f_name . "\r\n";
$vcard .= "N:" . $vcard_f_name . "\r\n";
}
}
elseif ($vcard_s_name != ""){
$vcard .= "FN:" . $vcard_s_name . "\r\n";
$vcard .= "N:" . $vcard_s_name . "\r\n";
}
if ($vcard_nickna != ""){
$vcard .= "NICKNAME:" . $vcard_nickna . "\r\n";
}
if ($vcard_compan != ""){
$vcard .= "ORG:" . $vcard_compan . "\r\n";
$vcard .= "SORTSTRING:" . $vcard_compan . "\r\n";
}
elseif ($vcard_f_name != ""){
$vcard .= "SORTSTRING:" . $vcard_f_name . "\r\n";
}
if ($vcard_birtda != ""){
$vcard .= "BDAY:" . $vcard_birtda . "\r\n";
}
if ($vcard_w_role != ""){
$vcard .= "ROLE:" . $vcard_w_role . "\r\n";
}
if ($vcard_w_titl != ""){
$vcard .= "TITLE:" . $vcard_w_titl . "\r\n";
}
if ($vcard_note != ""){
$vcard .= "NOTE:" . $vcard_note . "\r\n";
}
if ($vcard_w_mail != ""){
$item++;
$vcard .= "item$item.EMAIL;TYPE=INTERNET;type=PREF:" . $vcard_w_mail . "\r\n";
$vcard .= "item$item.X-ABLabel:email" . "\r\n";
}
if ($vcard_cellul != ""){
$vcard .= "TEL;TYPE=VOICE,CELL:" . $vcard_cellul . "\r\n";
}
if ($vcard_enum != ""){
$item++;
$vcard .= "item$item.TEL:" . $vcard_enum . "\r\n";
$vcard .= "item$item.X-ABLabel:ENUM" . "\r\n";
}
if ($vcard_sip != ""){
$item++;
$vcard .= "item$item.TEL;TYPE=INTERNET:" . $vcard_sip . "\r\n";
$vcard .= "item$item.X-ABLabel:SIP" . "\r\n";
}
if ($vcard_w_fax != ""){
$vcard .= "TEL;TYPE=FAX,WORK:" . $vcard_w_fax . "\r\n";
}
if ($vcard_w_phon != ""){
$vcard .= "TEL;TYPE=VOICE,WORK:" . $vcard_w_phon . "\r\n";
}
if ($vcard_uri != ""){
$vcard .= "URL:" . $vcard_uri . "\r\n";
}
if ($vcard_addr != ""){
$vcard .= "ADR;TYPE=HOME,POSTAL,PARCEL:" . $vcard_addr . "\r\n";
}
if ($vcard_labl != ""){
$vcard .= "LABEL;TYPE=DOM,HOME,POSTAL,PARCEL:" . $vcard_labl . "\r\n";
}
$vcard_addr = "";
$vcard_labl = "";
if ($vcard_w_addr != ""){
$vcard_addr = ";;" . $vcard_w_addr;
$vcard_labl = $vcard_w_addr;
}
if ($vcard_w_city != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_city;
}
else{
$vcard_addr .= ";;;" . $vcard_w_city;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_city;
}
else {
$vcard_labl = $vcard_w_city;
}
}
if ($vcard_w_state != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_state;
}
else{
$vcard_addr .= ";;;" . $vcard_w_state;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_state;
}
else {
$vcard_labl = $vcard_w_state;
}
}
if ($vcard_w_zip != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_zip;
}
else{
$vcard_addr .= ";;;;" . $vcard_w_zip;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_zip;
}
else {
$vcard_labl = $vcard_w_zip;
}
}
if ($vcard_w_coun != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_coun;
}
else{
$vcard_addr .= ";;;;;" . $vcard_w_coun;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_coun;
}
else {
$vcard_labl = $vcard_w_coun;
}
}
if ($vcard_addr != ""){
$vcard .= "ADR;TYPE=WORK,POSTAL,PARCEL:" . $vcard_addr . "\r\n";
}
if ($vcard_labl != ""){
$vcard .= "LABEL;TYPE=DOM,WORK,POSTAL,PARCEL:" . $vcard_labl . "\r\n";
}
if ($vcard_categ != ""){
$vcard .= "CATEGORY:" . $vcard_categ . "\r\n";
}
$vcard .= "END:VCARD\n";
return $vcard;
}
}
class Presence {
function Presence($SoapEngine) {
$this->SoapEngine = $SoapEngine;
}
function publishPresence ($soapEngine,$SIPaccount=array(),$note='None',$activity='idle') {
if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) {
print "Error: soapEngine '$soapEngine' does not exist.\n";
return false;
}
if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) {
print "Error: SIP account not defined\n";
return false;
}
$this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url'];
$this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$allowed_activities=array('open',
'idle',
'busy',
'available'
);
if (in_array($activity,$allowed_activities)) {
$presentity['activity'] = $activity;
} else {
$presentity['activity'] = 'open';
}
$presentity['note'] = $note;
$result = $this->PresencePort->setPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password'], $presentity);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
return true;
}
function getPresenceInformation ($soapEngine,$SIPaccount) {
if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) {
print "Error: soapEngine '$soapEngine' does not exist.\n";
return false;
}
if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) {
print "Error: SIP account not defined";
return false;
}
$this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url'];
$this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$result = $this->PresencePort->getPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password']);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("
Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
return $result;
}
}
}
class recordGenerator extends SoapEngine {
//this class generates in bulk enum numbers and sip accounts
var $template = array();
var $allowedPorts = array();
var $maxRecords = 500;
var $minimum_number_length = 4;
var $maximum_number_length = 15;
var $default_ip_access_list = '';
var $default_call_limit = '';
function recordGenerator($generatorId,$record_generators,$soapEngines,$login_credentials=array()) {
$this->record_generators = $record_generators;
$this->generatorId = $generatorId;
$this->login_credentials = $login_credentials;
//dprint_r($this->login_credentials);
$keys = array_keys($this->record_generators);
if (!$generatorId) $generatorId=$keys[0];
if (!in_array($generatorId,array_keys($this->record_generators))) {
return false;
}
if (strlen($this->login_credentials['soap_filter'])) {
$this->soapEngines = $this->getSoapEngineAllowed($soapEngines,$this->login_credentials['soap_filter']);
} else {
$this->soapEngines = $soapEngines;
}
if (in_array($this->record_generators[$generatorId]['sip_engine'],array_keys($this->soapEngines))) {
// sip zones
if (count($this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']]) > 1 && !in_array('sip_accounts',$this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']])) {
// sip port not available
dprint("sip port not avaliable");
} else {
$sip_engine = 'sip_accounts@'.$this->record_generators[$generatorId]['sip_engine'];
$this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials);
$_sip_class = $this->SipSoapEngine->records_class;
$this->sipRecords = new $_sip_class($this->SipSoapEngine);
$this->sipRecords->getAllowedDomains();
print_r($this->record_generators[$generatorId]['sip_engine']);
if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']){
$this->default_ip_access_list = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list'];
}
if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']){
$this->default_call_limit = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit'];
}
}
} else {
printf ("Error: sip_engine %s does not exist ",$this->record_generators[$generatorId]['sip_engine']);
}
if (in_array($this->record_generators[$generatorId]['enum_engine'],array_keys($this->soapEngines))) {
if (count($this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']]) > 1 && !in_array('enum_numbers',$this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']])) {
dprint("enum port not avaliable");
// enum port not available
} else {
// enum mappings
$enum_engine = 'enum_numbers@'.$this->record_generators[$generatorId]['enum_engine'];
$this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials);
$_enum_class = $this->EnumSoapEngine->records_class;
$this->enumRecords = new $_enum_class($this->EnumSoapEngine);
}
} else {
printf ("Error: enum_engine %s does not exist ",$this->record_generators[$generatorId]['enum_engine']);
}
if (in_array($this->record_generators[$generatorId]['customer_engine'],array_keys($this->soapEngines))) {
if (count($this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']]) > 1 && !in_array('customers',$this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']])) {
dprint("customer port not avaliable");
} else {
$customer_engine = 'customers@'.$this->record_generators[$generatorId]['customer_engine'];
$this->CustomerSoapEngine = new SoapEngine($customer_engine,$soapEngines,$login_credentials);
$_customer_class = $this->CustomerSoapEngine->records_class;
$this->customerRecords = new $_customer_class($this->CustomerSoapEngine);
}
} else {
printf ("Error: customer_engine %s does not exist ",$this->record_generators[$generatorId]['customer_engine']);
}
if ($_REQUEST['reseller_filter']) $this->template['reseller']=intval($_REQUEST['reseller_filter']);
if ($_REQUEST['customer_filter']) $this->template['customer']=intval($_REQUEST['customer_filter']);
}
function showGeneratorForm() {
print "
";
print _("ENUM number generator");
print "
";
print "
";
print _("ENUM range");
print "
";
/*
if ($_REQUEST['range']) {
$selected_range[$_REQUEST['range']]='selected';
} else if ($_last_range=$this->enumRecords->getCustomerProperty('enum_generator_range')) {
$selected_range[$_last_range] = 'selected';
}
if (is_array($this->enumRecords->ranges)) {
print "";
foreach ($this->enumRecords->ranges as $_range) {
$rangeId=$_range['prefix'].'@'.$_range['tld'];
printf ("+%s under %s",$rangeId,$selected_range[$rangeId],$_range['prefix'],$_range['tld']);
}
print " ";
}
*/
list($_range['prefix'],$_range['tld'])=explode("@",$_REQUEST['range']);
printf (" +%s under %s",$_REQUEST['range'],$_range['prefix'],$_range['tld']);
print "
";
print "
";
print "";
print _("ENUM mapping template");
print " ";
print "
";
if ($_REQUEST['add_prefix']) {
$add_prefix=$_REQUEST['add_prefix'];
} else {
$add_prefix = $this->sipRecords->getCustomerProperty('enum_generator_add_prefix');
}
print "
";
print _("Add prefix after range:");
printf ("
",$add_prefix);
if ($_REQUEST['number_length']) {
$number_length=$_REQUEST['number_length'];
} else {
$number_length = $this->sipRecords->getCustomerProperty('enum_generator_number_length');
}
print "
";
print _("Number length:");
printf ("
",$number_length);
print _("SIP domain:");
print "
";
if (count($this->sipRecords->allowedDomains) > 0) {
if ($_REQUEST['domain']) {
$selected_domain[$_REQUEST['domain']]='selected';
} else if ($_last_domain=$this->sipRecords->getCustomerProperty('enum_generator_sip_domain')) {
$selected_domain[$_last_domain] = 'selected';
}
print "
";
foreach ($this->sipRecords->allowedDomains as $domain) {
printf ("%s",$domain,$selected_domain[$domain],$domain);
}
print " ";
} else {
print " ";
}
print "
";
print "
";
if ($_REQUEST['strip_digits']) {
$strip_digits=$_REQUEST['strip_digits'];
} else if ($strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_strip_digits')) {
} else {
$strip_digits=0;
}
print "
";
print _("Strip digits:");
printf ("
",$strip_digits);
print "
";
print _("Owner:");
printf ("
",$_REQUEST['owner']);
print "
";
print "
";
print _("Info:");
printf ("
",$_REQUEST['info']);
print "
";
if (count($this->sipRecords->allowedDomains) > 0) {
print "
";
print "
";
print "";
print _("SIP account template");
print " ";
print "
";
print "
";
print _("Create SIP records");
if ($_REQUEST['create_sip']) {
$checked_create_sip='checked';
} else {
$checked_create_sip='';
}
printf ("
",$checked_create_sip);
if ($_REQUEST['pstn']) {
$checked_pstn='checked';
} else {
$checked_pstn='';
}
print "
";
print _("PSTN access");
printf ("
",$checked_pstn);
if ($_REQUEST['prepaid']) {
$checked_prepaid='checked';
} else {
$checked_prepaid='';
}
print "
";
print _("Prepaid");
printf ("
",$checked_prepaid);
if ($_REQUEST['rpid_strip_digits']) {
$rpid_strip_digits=$_REQUEST['rpid_strip_digits'];
} else if ($rpid_strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_rpid_strip_digits')) {
} else {
$rpid_strip_digits=0;
}
print "
";
print _("Strip digits from Caller-ID");
printf ("
",$rpid_strip_digits);
print "
";
print _("Quota");
printf ("
",$_REQUEST['quota']);
print "
";
print _("Password");
printf ("
",$_REQUEST['password']);
if (isset($_REQUEST['call_limit'])) {
$call_limit=$_REQUEST['call_limit'];
} else {
$call_limit = $this->sipRecords->getCustomerProperty('enum_generator_call_limit');
}
if (!strlen($call_limit) && strlen($this->default_call_limit)) {
$call_limit = $this->default_call_limit;
}
print "
";
print _("PSTN call limit");
printf ("
",$call_limit);
if (isset($_REQUEST['ip_access_list'])) {
$ip_access_list=$_REQUEST['ip_access_list'];
} else {
$ip_access_list = $this->sipRecords->getCustomerProperty('enum_generator_ip_access_list');
}
if (!$ip_access_list && $this->default_ip_access_list) {
$ip_access_list = $this->default_ip_access_list;
}
print "
";
print _("IP access list");
printf ("
",$ip_access_list);
}
if ($_REQUEST['nr_records']) {
$nr_records=$_REQUEST['nr_records'];
} else {
$nr_records=1;
}
print "
";
print "
";
print " ";
print " ";
printf ("
Number of records:
",$nr_records);
print " ";
print "
";
print "
";
print _("Existing records will not be overwritten. ");
print "
";
$this->printHiddenFormElements();
print "
";
}
function checkGenerateRequest() {
// check number of records
$this->template['create_sip']=trim($_REQUEST['create_sip']);
$ip_access_list = preg_replace("/\s+/"," ", $_REQUEST['ip_access_list']);
if (strlen($ip_access_list) and !check_ip_access_list(trim($ip_access_list), true)) {
printf ("Error: IP access lists must be a space separated list of IP network/mask, example: 10.0.20.40/24 ");
return false;
}
$this->template['ip_access_list'] = trim($ip_access_list);
if (strlen($_REQUEST['call_limit']) && !is_numeric($_REQUEST['call_limit'])) {
printf ("Error: PSTN call limit must be numeric ");
return false;
}
$this->template['call_limit']=$_REQUEST['call_limit'];
$this->template['rpid_strip_digits']=intval($_REQUEST['rpid_strip_digits']);
$this->template['info']=trim($_REQUEST['info']);
$nr_records=trim($_REQUEST['nr_records']);
if (!is_numeric($nr_records) || $nr_records < 1 || $nr_records > $this->maxRecords) {
printf ("Error: number of records must be a number between 1 and %d ",$this->maxRecords);
return false;
}
$this->template['nr_records'] = $nr_records;
$number_length=trim($_REQUEST['number_length']);
if (!is_numeric($number_length) || $number_length < $this->minimum_number_length || $number_length > $this->maximum_number_length) {
printf ("Error: number length must be a number between 4 and 15 ",$this->minimum_number_length,$this->maximum_number_length);
return false;
}
$this->template['number_length'] = $number_length;
$strip_digits=trim($_REQUEST['strip_digits']);
if (!is_numeric($strip_digits) || $strip_digits < 0 || $number_length < $strip_digits + 3) {
printf ("Error: strip digits + 3 must be smaller then %d ",$number_length);
return false;
}
$this->template['strip_digits'] = $strip_digits;
// sip domain
$domain=trim($_REQUEST['domain']);
if (!strlen($domain)) {
print "Error: SIP domain is missing ";
return false;
}
$this->template['domain'] = $domain;
$add_prefix=trim($_REQUEST['add_prefix']);
if (strlen($add_prefix) && !is_numeric($add_prefix)) {
print "Error: Add prefix must be numeric ";
return false;
}
$this->template['add_prefix'] = $add_prefix;
$owner=trim($_REQUEST['owner']);
if (strlen($owner) && !is_numeric($owner)) {
print "Error: Owner must be an integer ";
return false;
}
// check ENUM TLD
list($rangePrefix,$tld)=explode('@',trim($_REQUEST['range']));
$this->template['range'] = trim($_REQUEST['range']);
$this->template['rangePrefix'] = $rangePrefix;
$this->template['tld'] = $tld;
$this->template['quota'] = intval($_REQUEST['quota']);
$this->template['owner'] = intval($owner);
$this->template['pstn'] = intval($_REQUEST['pstn']);
$this->template['prepaid'] = intval($_REQUEST['prepaid']);
$this->template['password'] = trim($_REQUEST['password']);
///////////////////////////////////////
// logical checks
if (strlen($this->template['add_prefix'])) {
$start = $this->template['add_prefix'];
} else {
$start = 0;
}
$this->template['digitsAfterRange'] = $this->template['number_length'] - strlen($this->template['rangePrefix']);
if ($this->template['number_length'] == strlen($this->template['rangePrefix']) + strlen($this->template['add_prefix'])) {
$this->template['firstNumber'] = $this->template['rangePrefix'].$this->template['add_prefix'];
$this->template['lastNumber'] = substr($this->template['firstNumber'],0,-1).'9';
$this->template['maxNumbers'] = $this->template['lastNumber'] - $this->template['firstNumber'] + 1;
} else {
$this->template['firstNumber'] = $this->template['rangePrefix'].str_pad($start,$this->template['digitsAfterRange'],'0');
$this->template['lastNumber'] = sprintf("%.0f", $this->template['firstNumber'] + pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])) - 1);
$this->template['maxNumbers'] = pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix']));
}
dprint_r($this->template);
if ($this->template['maxNumbers'] < $this->template['nr_records']) {
printf ("Error: Insufficient numbers in range, requested = %d, available = %d ",$this->template['nr_records'],$this->template['maxNumbers']);
return false;
}
return true;
}
function generateRecords() {
print "";
if (!$this->checkGenerateRequest()) {
return false;
}
print "
Generating records
";
$_p=array(
array('name' => 'enum_generator_sip_domain',
'category' => 'web',
'value' => strval($this->template['domain']),
'permission' => 'customer'
),
array('name' => 'enum_generator_range',
'category' => 'web',
'value' => strval($this->template['range']),
'permission' => 'customer'
),
array('name' => 'enum_generator_strip_digits',
'category' => 'web',
'value' => strval($this->template['strip_digits']),
'permission' => 'customer'
),
array('name' => 'enum_generator_number_length',
'category' => 'web',
'value' => strval($this->template['number_length']),
'permission' => 'customer'
),
array('name' => 'enum_generator_add_prefix',
'category' => 'web',
'value' => strval($this->template['add_prefix']),
'permission' => 'customer'
),
array('name' => 'enum_generator_rpid_strip_digits',
'category' => 'web',
'value' => strval($this->template['rpid_strip_digits']),
'permission' => 'customer'
),
array('name' => 'enum_generator_call_limit',
'category' => 'web',
'value' => strval($this->template['call_limit']),
'permission' => 'customer'
),
array('name' => 'enum_generator_ip_access_list',
'category' => 'web',
'value' => strval($this->template['ip_access_list']),
'permission' => 'customer'
)
);
$this->enumRecords->setCustomerProperties($_p);
if ($this->template['owner']) {
if ($customer = $this->customerRecords->getRecord($this->template['owner'])) {
$this->template['email'] = $customer->email;
$this->template['firstName'] = $customer->firstName;
$this->template['lastName'] = $customer->lastName;
if (!strlen($this->template['info'])) {
$this->template['info'] = $customer->firstName.' '.$customer->lastName;
}
} else {
printf ("Error: cannot retrieve customer information for owner %d ",$this->template['owner']);
}
}
dprint_r($this->template);
$i=0;
while ($i < $this->template['nr_records']) {
$number = sprintf("%.0f", $this->template['firstNumber'] + $i);
$username = substr($number,$this->template['strip_digits']);
$mapto = 'sip:'.$username.'@'.$this->template['domain'];
print "";
printf ('Generating number +%s with mapping %s ',$number,$mapto);
flush();
$enumMapping = array('tld' => $this->template['tld'],
'number' => $number,
'type' => 'sip',
'mapto' => $mapto,
'info' => $this->template['info'],
'owner' => $this->template['owner']
);
if ($this->template['create_sip']) {
if (preg_match("/^0/",$username)) {
printf ('SIP accounts starting with 0 are not generated (%s@%s)',$username,$this->template['domain']);
continue;
}
$groups=array();
printf ('and sip account %s@%s ',$username,$this->template['domain']);
$ip_access_list = check_ip_access_list($this->template['ip_access_list']);
$sipAccount = array('account' => $username.'@'.$this->template['domain'],
'quota' => $this->template['quota'],
'prepaid' => $this->template['prepaid'],
'password' => $this->template['password'],
'groups' => $groups,
'owner' => $this->template['owner'],
'pstn' => $this->template['pstn'],
'ip_access_list' => $ip_access_list,
'call_limit' => $this->template['call_limit']
);
if ($this->template['firstName']) {
$sipAccount['fullname'] = $this->template['firstName'].' '.$this->template['lastName'];
}
if ($this->template['email']) {
$sipAccount['email'] = $this->template['email'];
}
if ($this->template['pstn']) {
$strip_rpid=intval($this->template['rpid_strip_digits']);
if ($strip_rpid && strlen($number) > $strip_rpid) {
$sipAccount['rpid']=substr($number,intval($this->template['rpid_strip_digits']));
} else {
$sipAccount['rpid']=$number;
}
}
} else {
unset($sipAccount);
}
dprint_r($sipAccount);
if (is_array($enumMapping)) $this->enumRecords->addRecord($enumMapping);
if (is_array($sipAccount)) $this->sipRecords->addRecord($sipAccount);
$i++;
}
print " ";
return true;
}
function printHiddenFormElements () {
printf(" ",$this->generatorId);
if ($this->adminonly) {
printf(" ",$this->adminonly);
}
if ($this->template['customer']) {
printf(" ",$this->template['customer']);
}
if ($this->template['reseller']) {
printf(" ",$this->template['reseller']);
}
foreach (array_keys($this->EnumSoapEngine->extraFormElements) as $element) {
if (!strlen($this->EnumSoapEngine->extraFormElements[$element])) continue;
printf (" \n",$element,$this->EnumSoapEngine->extraFormElements[$element]);
}
}
function getSoapEngineAllowed($soapEngines,$filter) {
// filter syntax:
// $filter="engine1:port1,port2,port3 engine2 engine3";
// where engine is a connection from ngnpro_engines.inc and
// port is valid port from that engine like sip_accounts or enum_numbers
$_filter_els=explode(" ",trim($filter));
foreach(array_keys($soapEngines) as $_engine) {
foreach ($_filter_els as $_filter) {
unset($_allowed_engine);
$_allowed_ports=array();
list($_allowed_engine,$_allowed_ports_els) = explode(":",$_filter);
if ($_allowed_ports_els) {
$_allowed_ports = explode(",",$_allowed_ports_els);
}
if ($_engine == $_allowed_engine) {
$soapEngines_checked[$_engine]=$soapEngines[$_engine];
$this->allowedPorts[$_engine]=$_allowed_ports;
continue;
}
}
}
return $soapEngines_checked;
}
}
class Actions {
// this class perfom actions on an array of entities returned by selections
var $actions = array();
var $version = 1;
var $sub_action_parameter_size = 35;
var $html = true;
function Actions($SoapEngine, $login_credentials) {
$this->SoapEngine = $SoapEngine;
$this->login_credentials = $login_credentials;
$this->version = $this->SoapEngine->version;
$this->adminonly = $this->SoapEngine->adminonly;
}
function log_action($action='Unknown') {
global $CDRTool;
$location = "Unknown";
$_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']);
if ($_loc['country_name']) {
$location = $_loc['country_name'];
}
$log = sprintf("CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s",
$this->login_credentials['username'],
$this->login_credentials['login_type'],
$CDRTool['impersonate'],
$_SERVER['REMOTE_ADDR'],
$location,
$this->SoapEngine->port,
$action,
$_SERVER['PHP_SELF']
);
syslog(LOG_NOTICE, $log);
}
function execute($selectionKeys, $action, $sub_action_parameter) {
}
function showActionsForm($filters,$sorting,$hideParameter=false) {
if (!count($this->actions)) return;
printf (" ",$_SERVER['PHP_SELF']);
print "
";
print "
";
if ($this->adminonly) {
print "
adminonly>
";
}
print "
";
$j=0;
foreach (array_keys($this->actions) as $_action) {
$j++;
printf ("%d. %s",$_action,$j,$this->actions[$_action]);
}
print " ";
if (!$hideParameter) {
printf ("
",$this->sub_action_parameter_size);
}
print "
";
print " Maximum of 500 records
";
foreach (array_keys($filters) as $_filter) {
printf ("
\n", $_filter,$filters[$_filter]);
}
foreach (array_keys($sorting) as $_sorting) {
printf ("
\n", $_sorting,$sorting[$_sorting]);
}
printf("
",$this->SoapEngine->service);
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
printf ("
\n",$element,$this->SoapEngine->extraFormElements[$element]);
}
print "
";
}
}
class SipAccountsActions extends Actions {
var $actions=array('block' => 'Block SIP accounts',
'deblock' => 'Deblock SIP accounts',
'enable_pstn' => 'Enable access to PSTN for the SIP accounts',
'disable_pstn' => 'Disable access to PSTN for the SIP accounts',
'deblock_quota' => 'Deblock SIP accounts blocked by quota',
'prepaid' => 'Make SIP accounts prepaid',
'postpaid' => 'Make SIP accounts postpaid',
'delete' => 'Delete SIP accounts',
'setquota' => 'Set quota of SIP account to:',
'rpidasusername' => 'Set PSTN caller ID as the username',
'prefixtorpid' => 'Add to PSTN caller ID this prefix:',
'rmdsfromrpid' => 'Remove from PSTN caller ID digits:',
'addtogroup' => 'Add SIP accounts to group:',
'removefromgroup'=> 'Remove SIP accounts from group:',
'addbalance' => 'Add to prepaid balance value:',
'changeowner' => 'Change owner to:',
'changefirstname'=> 'Change first name to:',
'changelastname' => 'Change last name to:',
'changepassword' => 'Change password to:'
);
function SipAccountsActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action ";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
//printf ("Performing action=%s on key=%s",$action,$key);
$account=array('username' => $key['username'],
'domain' => $key['domain']
);
printf ("%s@%s",$key['username'],$key['domain']);
if ($action=='block') {
$this->log_action('addToGroup');
$function=array('commit' => array('name' => 'addToGroup',
'parameters' => array($account,'blocked'),
'logs' => array('success' => sprintf('SIP account %s@%s has been blocked',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='deblock') {
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,'blocked'),
'logs' => array('success' => sprintf('SIP account %s@%s has been de-blocked',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='removefromgroup') {
if (!strlen($sub_action_parameter)) {
printf ("Error: you must enter a group name ");
break;
}
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,$sub_action_parameter),
'logs' => array('success' => sprintf('SIP account %s@%s has been removed from group %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='addtogroup') {
$this->log_action('addToGroup');
if (!strlen($sub_action_parameter)) {
printf ("Error: you must enter a group name ");
break;
}
$function=array('commit' => array('name' => 'addToGroup',
'parameters' => array($account,$sub_action_parameter),
'logs' => array('success' => sprintf('SIP account %s@%s is now in group %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='deblock_quota') {
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,'quota'),
'logs' => array('success' => sprintf('SIP account %s@%s has been deblocked from quota',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='disable_pstn') {
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,'free-pstn'),
'logs' => array('success' => sprintf('SIP account %s@%s has no access to the PSTN',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='enable_pstn') {
$this->log_action('addToGroup');
$function=array('commit' => array('name' => 'addToGroup',
'parameters' => array($account,'free-pstn'),
'logs' => array('success' => sprintf('SIP account %s@%s has access to the PSTN',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='delete') {
$this->log_action('deleteAccount');
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array($account),
'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='prepaid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$result->prepaid=1;
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s is now prepaid',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='postpaid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$result->prepaid=0;
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s is now postpaid',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='setquota') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->quota = intval($sub_action_parameter);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has quota set to %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='rmdsfromrpid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter) && strlen($result->rpid) > $sub_action_parameter) {
printf("%s %s",$result->rpid,$sub_action_parameter);
$result->rpid=substr($result->rpid,$sub_action_parameter);
printf("%s %s",$result->rpid,$sub_action_parameter);
} else {
printf ("Error: '%s' must be numeric and less than caller if length ",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$result->rpid)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='rpidasusername') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($key['username'])) $result->rpid=$key['username'];
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$key['username'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='prefixtorpid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter)) {
$result->rpid=$sub_action_parameter.$result->rpid;
} else {
printf ("Error: '%s' must be numeric ",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s ',$key['username'],$key['domain'],$result->rpid)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changecustomer') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter)) {
$result->customer=intval($sub_action_parameter);
} else {
printf ("Error: '%s' must be numeric ",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has customer set to %s ',$key['username'],$key['domain'],$result->customer)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changeowner') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter)) {
$result->owner=intval($sub_action_parameter);
} else {
printf ("Error: '%s' must be numeric ",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has owner set to %s ',$key['username'],$key['domain'],$result->owner)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changefirstname') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->firstName=trim($sub_action_parameter);
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s first name has been set to %s ',$key['username'],$key['domain'],$result->firstName)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changelastname') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->lastName=trim($sub_action_parameter);
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s last name has been set to %s ',$key['username'],$key['domain'],$result->lastName)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changepassword') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->password=trim($sub_action_parameter);
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('Password for SIP account %s@%s has been changed',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='addbalance') {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: you must enter a positive balance ");
break;
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
}
if (!$result->prepaid) {
printf ("Info: SIP account %s@%s is not prepaid, no action performed ",$key['username'],$key['domain']);
continue;
}
$this->log_action('addBalance');
$function=array('commit' => array('name' => 'addBalance',
'parameters' => array($account,$sub_action_parameter),
'logs' => array('success' => sprintf('SIP account %s@%s balance has been increased with %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
print " ";
}
}
class SipAliasesActions extends Actions {
var $actions=array(
'delete' => 'Delete SIP aliases'
);
function SipAliasesActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action ";
return false;
}
print "";
foreach($selectionKeys as $key) {
print "";
flush();
//printf ("Performing action=%s on key=%s",$action,$key);
$alias=array('username' => $key['username'],
'domain' => $key['domain']
);
if ($action=='delete') {
$this->log_action('deleteAlias');
$function=array('commit' => array('name' => 'deleteAlias',
'parameters' => array($alias),
'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
print " ";
}
}
class EnumMappingsActions extends Actions {
var $actions=array(
'changettl' => 'Change TTL to:',
'changeowner' => 'Change owner to:',
'changeinfo' => 'Change info to:',
'delete' => 'Delete ENUM mappings'
);
var $mapping_fields=array('id' => 'integer',
'type' => 'text',
'mapto' => 'text',
'priority' => 'integer',
'ttl' => 'integer'
);
function EnumMappingsActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action ";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
print "";
$enum_id=array('number' => $key['number'],
'tld' => $key['tld']
);
if ($action=='delete') {
//printf ("Performing action=%s on key=%s",$action,$key);
$function=array('commit' => array('name' => 'deleteNumber',
'parameters' => array($enum_id),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$key['number'],$key['tld'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action == 'changettl') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$number = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($number)) {
$error_msg = $number->getMessage();
$error_fault= $number->getFault();
$error_code = $number->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: TTL '%s' must be numeric ",$sub_action_parameter);
continue;
}
$new_mappings=array();
foreach ($number->mappings as $_mapping) {
foreach (array_keys($this->mapping_fields) as $field) {
if ($field == 'ttl') {
$new_mapping[$field]=intval($sub_action_parameter);
} else {
if ($this->mapping_fields[$field] == 'integer') {
$new_mapping[$field]=intval($_mapping->$field);
} else {
$new_mapping[$field]=$_mapping->$field;
}
}
}
$new_mappings[]=$new_mapping;
}
$number->mappings=$new_mappings;
$this->log_action('updateNumber');
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number %s@%s TTL has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeowner') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$number = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($number)) {
$error_msg = $number->getMessage();
$error_fault= $number->getFault();
$error_code = $number->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$new_mappings=array();
foreach ($number->mappings as $_mapping) {
$new_mappings[]=$_mapping;
}
$number->mappings=$new_mappings;
if (is_numeric($sub_action_parameter)) {
$number->owner=intval($sub_action_parameter);
} else {
printf ("Error: Owner '%s' must be numeric ",$sub_action_parameter);
continue;
}
$this->log_action('updateNumber');
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number %s@%s owner has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeinfo') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$number = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($number)) {
$error_msg = $number->getMessage();
$error_fault= $number->getFault();
$error_code = $number->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$new_mappings=array();
foreach ($number->mappings as $_mapping) {
$new_mappings[]=$_mapping;
}
$number->mappings=$new_mappings;
$number->info=trim($sub_action_parameter);
$this->log_action('updateNumber');
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number %s@%s info has been set to %s',$key['number'],$key['tld'],trim($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
}
print " ";
}
}
class DnsRecordsActions extends Actions {
var $sub_action_parameter_size = 50;
var $actions = array(
'changettl' => 'Change TTL to:',
'changepriority' => 'Change Priority to:',
'changevalue' => 'Change value to:',
'delete' => 'Delete records'
);
function DnsRecordsActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys, $action, $sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action ";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
print "";
//printf ("Performing action=%s on key=%s",$action,$key['id']);
if ($action=='delete') {
$this->log_action('deleteRecord');
$function=array('commit' => array('name' => 'deleteRecord',
'parameters' => array(intval($key['id'])),
'logs' => array('success' => sprintf('Record %d has been deleted',$key['id'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action == 'changettl') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecord');
$record = $this->SoapEngine->soapclient->getRecord($key['id']);
if ((new PEAR)->isError($record)) {
$error_msg = $record->getMessage();
$error_fault= $record->getFault();
$error_code = $record->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: TTL '%s' must be numeric ",$sub_action_parameter);
continue;
}
$record->ttl=intval($sub_action_parameter);
$this->log_action('updateRecord');
$function=array('commit' => array('name' => 'updateRecord',
'parameters' => array($record),
'logs' => array('success' => sprintf('TTL for record %d has been set to %d',$key['id'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changepriority') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecord');
$record = $this->SoapEngine->soapclient->getRecord($key['id']);
if ((new PEAR)->isError($record)) {
$error_msg = $record->getMessage();
$error_fault= $record->getFault();
$error_code = $record->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (is_numeric($sub_action_parameter)) {
$record->priority=intval($sub_action_parameter);
} else {
printf ("Error: Priority '%s' must be numeric ",$sub_action_parameter);
continue;
}
$this->log_action('updateRecord');
$function=array('commit' => array('name' => 'updateRecord',
'parameters' => array($record),
'logs' => array('success' => sprintf('Priority for record %d has been set to %d',$key['id'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changevalue') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecord');
$record = $this->SoapEngine->soapclient->getRecord($key['id']);
if ((new PEAR)->isError($record)) {
$error_msg = $record->getMessage();
$error_fault= $record->getFault();
$error_code = $record->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$record->value=$sub_action_parameter;
$this->log_action('updateRecord');
$function=array('commit' => array('name' => 'updateRecord',
'parameters' => array($record),
'logs' => array('success' => sprintf('Value of record %d has been set to %s',$key['id'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
}
print " ";
}
}
class DnsZonesActions extends Actions {
var $sub_action_parameter_size = 50;
var $actions=array(
'changettl' => 'Change TTL to:',
'changeexpire' => 'Change Expire to:',
'changeminimum' => 'Change Minimum to:',
'changeretry' => 'Change Retry to:',
'changeinfo' => 'Change Info to:',
'addnsrecord' => 'Add name server:',
'removensrecord' => 'Remove name server:',
'delete' => 'Delete zones',
'export' => 'Export zones'
);
function DnsZonesActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action ";
return false;
}
if ($action!='export') {
print "";
} else {
$exported_data=array('dns_zones'=>array());
$export_customers=array();
}
foreach($selectionKeys as $key) {
flush();
if ($action!='export') {
print "";
}
//printf ("Performing action=%s on key=%s",$action,$key['name']);
if ($action=='delete') {
$this->log_action('deleteZone');
$function=array('commit' => array('name' => 'deleteZone',
'parameters' => array($key['name']),
'logs' => array('success' => sprintf('Zone %s has been deleted',$key['name'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='export') {
// Filter
$filter=array(
'zone' => $key['name']
);
$range = array('start' => 0,'count' => 5000);
// Compose query
$Query=array('filter' => $filter,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$result = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if (!in_array($result->customer, $export_customers)) {
$export_customers[]=$result->customer;
}
if (!in_array($result->reseller, $export_customers)) {
$export_customers[]=$result->reseller;
}
$exported_data['dns_zones'][] = objectToArray($result);
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecords');
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,'getRecords'),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['dns_records'] = objectToArray($result->records);
}
} else if ($action == 'changettl') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: TTL '%s' must be numeric ",$sub_action_parameter);
continue;
}
$zone->ttl=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('TTL for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeexpire') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: Expire '%s' must be numeric ",$sub_action_parameter);
continue;
}
$zone->expire=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Expire for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeminimum') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: Minimum '%s' must be numeric ",$sub_action_parameter);
continue;
}
$zone->minimum=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Minimum for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'addnsrecord') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$zone->nameservers[]=$sub_action_parameter;
$zone->nameservers=array_unique($zone->nameservers);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Added NS record %s for zone %s',$sub_action_parameter,$key['name'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'removensrecord') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$new_servers=array();
foreach ($zone->nameservers as $_ns) {
if ($_ns == $sub_action_parameter) continue;
$new_servers[]=$_ns;
}
$zone->nameservers=array_unique($new_servers);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('NS record %s removed from zone %s',$sub_action_parameter,$key['name'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeretry') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: Retry '%s' must be numeric ",$sub_action_parameter);
continue;
}
$zone->retry=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Retry for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeinfo') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s ",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$zone->info=$sub_action_parameter;
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Info for zone %s has been set to %s',$key['name'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
}
if ($action!='export') {
print " ";
} else {
// Filter
foreach ($export_customers as $customer) {
$filter=array(
'customer' => intval($customer),
);
// Compose query
$Query=array('filter' => $filter
);
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$this->getCustomers('getZone');
// Call function
$result = $this->SoapEngine->soapclientCustomers->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['customers'] = objectToArray($result->accounts);
}
}
print_r(json_encode($exported_data));
}
}
}
class CustomersActions extends Actions {
var $actions=array(
'delete' => 'Delete customers'
);
function CustomerActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action ";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
print "";
if ($action=='delete') {
$this->log_action('deleteAccount');
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array(intval($key)),
'logs' => array('success' => sprintf('Customer id %s has been deleted',$key)))
);
$this->SoapEngine->execute($function,$this->html);
}
}
print " ";
}
}
function check_ip_access_list($acl_string, $check=false) {
$list=explode(" ",$acl_string);
$ip_access_list = array();
foreach ($list as $el) {
$els = explode("/",$el);
if (count($els) != 2) {
if ($check) {
return false;
} else {
continue;
}
}
list($ip,$mask) = $els;
if ($mask <0 or $mask > 32) {
if ($check) {
return false;
} else {
continue;
}
}
if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) {
if ($check) {
return false;
} else {
continue;
}
}
$ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask));
}
if ($check) {
return true;
} else {
return $ip_access_list;
}
}
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
// with get_object_vars function
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
?>
diff --git a/library/ngnpro_soap_library.php b/library/ngnpro_soap_library.php
index fe4950a..78275c0 100644
--- a/library/ngnpro_soap_library.php
+++ b/library/ngnpro_soap_library.php
@@ -1,1651 +1,1651 @@
_wsdl)
list($ptype, $arrayType, $array_type_ns, $array_depth)
= $this->_wsdl->getSchemaType($type, $name, $typeNamespace);
if (!$arrayType) $arrayType = $artype;
if (!$ptype) $ptype = $this->_getType($value);
if (!$type) $type = $ptype;
if (strcasecmp($ptype,'Struct') == 0 || strcasecmp($type,'Struct') == 0) {
// struct
$vars = NULL;
if (is_object($value)) {
$vars = get_object_vars($value);
} else {
$vars = &$value;
}
if (is_array($vars)) {
foreach (array_keys($vars) as $k) {
if ($k[0]=='_') continue; // hide private vars
if (is_object($vars[$k])) {
if (is_a($vars[$k],'soap_value')) {
$xmlout_value .= $vars[$k]->serialize($this);
} else {
// XXX get the members and serialize them instead
// converting to an array is more overhead than we
// should realy do, but php-soap is on it's way.
$xmlout_value .= $this->_serializeValue(get_object_vars($vars[$k]), $k, false, $this->_section5?NULL:$elNamespace);
}
} else {
$xmlout_value .= $this->_serializeValue($vars[$k],$k, false, $this->_section5?NULL:$elNamespace);
}
}
}
} else if (strcasecmp($ptype,'Array')==0 || strcasecmp($type,'Array')==0) {
// array
$typeNamespace = SOAP_SCHEMA_ENCODING;
$orig_type = $type;
$type = 'Array';
$numtypes = 0;
// XXX this will be slow on larger array's. Basicly, it flattens array's to allow us
// to serialize multi-dimensional array's. We only do this if arrayType is set,
// which will typicaly only happen if we are using WSDL
if (isset($options['flatten']) || ($arrayType && (strchr($arrayType,',') || strstr($arrayType,'][')))) {
$numtypes = $this->_multiArrayType($value, $arrayType, $ar_size, $xmlout_value);
}
$array_type = $array_type_prefix = '';
if ($numtypes != 1) {
$arrayTypeQName =new QName($arrayType);
$arrayType = $arrayTypeQName->name;
$array_types = array();
$array_val = NULL;
// serialize each array element
$ar_size = count($value);
foreach ($value as $array_val) {
if ($this->_isSoapValue($array_val)) {
$array_type = $array_val->type;
$array_types[$array_type] = 1;
$array_type_ns = $array_val->type_namespace;
$xmlout_value .= $array_val->serialize($this);
} else {
$array_type = $this->_getType($array_val);
$array_types[$array_type] = 1;
$xmlout_value .= $this->_serializeValue($array_val,'item', $array_type, $this->_section5?NULL:$elNamespace);
}
}
$xmlout_offset = " SOAP-ENC:offset=\"[0]\"";
if (!$arrayType) {
$numtypes = count($array_types);
if ($numtypes == 1) $arrayType = $array_type;
// using anyType is more interoperable
if ($array_type == 'Struct') {
$array_type = '';
} else if ($array_type == 'Array') {
$arrayType = 'anyType';
$array_type_prefix = 'xsd';
} else
if (!$arrayType) $arrayType = $array_type;
}
}
if (!$arrayType || $numtypes > 1) {
$arrayType = 'xsd:anyType'; // should reference what schema we're using
} else {
if ($array_type_ns) {
$array_type_prefix = $this->_getNamespacePrefix($array_type_ns);
} else if (array_key_exists($arrayType, $this->_typemap[$this->_XMLSchemaVersion])) {
$array_type_prefix = $this->_namespaces[$this->_XMLSchemaVersion];
}
if ($array_type_prefix)
$arrayType = $array_type_prefix.':'.$arrayType;
}
$xmlout_arrayType = " SOAP-ENC:arrayType=\"" . $arrayType;
if ($array_depth != null) {
for ($i = 0; $i < $array_depth; $i++) {
$xmlout_arrayType .= '[]';
}
}
$xmlout_arrayType .= "[$ar_size]\"";
} else if ($this->_isSoapValue($value)) {
$xmlout_value =& $value->serialize($this);
} else if ($type == 'string') {
$xmlout_value = htmlspecialchars($value);
} else if ($type == 'rawstring') {
$xmlout_value =& $value;
} else if ($type == 'boolean') {
$xmlout_value = $value?'true':'false';
} else {
$xmlout_value =& $value;
}
// add namespaces
if ($elNamespace) {
$elPrefix = $this->_getNamespacePrefix($elNamespace);
$xmlout_name = "$elPrefix:$name";
} else {
$xmlout_name = $name;
}
if ($typeNamespace) {
$typePrefix = $this->_getNamespacePrefix($typeNamespace);
$xmlout_type = "$typePrefix:$type";
} else if ($type && array_key_exists($type, $this->_typemap[$this->_XMLSchemaVersion])) {
$typePrefix = $this->_namespaces[$this->_XMLSchemaVersion];
$xmlout_type = "$typePrefix:$type";
}
// handle additional attributes
$xml_attr = '';
if (count($attributes) > 0) {
foreach ($attributes as $k => $v) {
$kqn =new QName($k);
$vqn =new QName($v);
$xml_attr .= ' '.$kqn->fqn().'="'.$vqn->fqn().'"';
}
}
// store the attachement for mime encoding
if (isset($options['attachment']))
$this->__attachments[] = $options['attachment'];
if ($this->_section5) {
if ($xmlout_type) $xmlout_type = " xsi:type=\"$xmlout_type\"";
if (is_null($xmlout_value)) {
$xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xml_attr/>";
} else {
$xml = "\r\n<$xmlout_name$xmlout_type$xmlns$xmlout_arrayType$xmlout_offset$xml_attr>".
$xmlout_value."$xmlout_name>";
}
} else {
if (is_null($xmlout_value)) {
$xml = "\r\n<$xmlout_name$xmlns$xml_attr/>";
} else {
$xml = "\r\n<$xmlout_name$xmlns$xml_attr>".
$xmlout_value."$xmlout_name>";
}
}
return $xml;
}
function addHeader($soap_value) {
// add a new header to the SOAP message if not already exists
if (is_array($soap_value) && is_array($this->headersOut)) {
foreach ($this->headersOut as $_header) {
if ($_header->name == $soap_value[0]) {
return true;
}
}
}
if (is_a($soap_value,'soap_header')) {
$this->headersOut[] =& $soap_value;
} else if (gettype($soap_value) == 'array') {
// name, value, namespace, mustunderstand, actor
$this->headersOut[] =new SOAP_Header($soap_value[0], NULL, $soap_value[1], $soap_value[2], $soap_value[3]);;
} else {
$this->_raiseSoapFault("Don't understand the header info you provided. Must be array or SOAP_Header.");
}
}
}
class WebService_NGNPro_SipPort extends SOAP_Client_Custom
{
function WebService_NGNPro_SipPort($path = 'https://mdns.sipthor.net/ngnpro/')
{
$this->SOAP_Client($path, 0);
}
function &addGateway($gateway)
{
// gateway is a ComplexType Gateway,
// refer to wsdl for more info
$gateway = new SOAP_Value('gateway', '{urn:AGProjects:NGNPro}Gateway', $gateway);
$result = $this->call('addGateway',
$v = array('gateway' => $gateway),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateGateway($gateway)
{
// gateway is a ComplexType Gateway,
// refer to wsdl for more info
$gateway = new SOAP_Value('gateway', '{urn:AGProjects:NGNPro}Gateway', $gateway);
$result = $this->call('updateGateway',
$v = array('gateway' => $gateway),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteGateway($id)
{
$result = $this->call('deleteGateway',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getGateways($query)
{
// query is a ComplexType GatewayQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}GatewayQuery', $query);
$result = $this->call('getGateways',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addGatewayRule($rule)
{
// rule is a ComplexType GatewayRule,
// refer to wsdl for more info
$rule = new SOAP_Value('rule', '{urn:AGProjects:NGNPro}GatewayRule', $rule);
$result = $this->call('addGatewayRule',
$v = array('rule' => $rule),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateGatewayRule($rule)
{
// rule is a ComplexType GatewayRule,
// refer to wsdl for more info
$rule = new SOAP_Value('rule', '{urn:AGProjects:NGNPro}GatewayRule', $rule);
$result = $this->call('updateGatewayRule',
$v = array('rule' => $rule),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteGatewayRule($id)
{
$result = $this->call('deleteGatewayRule',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getGatewayRules($query)
{
// query is a ComplexType GatewayRuleQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}GatewayRuleQuery', $query);
$result = $this->call('getGatewayRules',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addCarrier($carrier)
{
// carrier is a ComplexType Carrier,
// refer to wsdl for more info
$carrier = new SOAP_Value('carrier', '{urn:AGProjects:NGNPro}Carrier', $carrier);
$result = $this->call('addCarrier',
$v = array('carrier' => $carrier),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateCarrier($carrier)
{
// carrier is a ComplexType Carrier,
// refer to wsdl for more info
$carrier = new SOAP_Value('carrier', '{urn:AGProjects:NGNPro}Carrier', $carrier);
$result = $this->call('updateCarrier',
$v = array('carrier' => $carrier),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteCarrier($id)
{
$result = $this->call('deleteCarrier',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getCarriers($query)
{
// query is a ComplexType CarrierQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CarrierQuery', $query);
$result = $this->call('getCarriers',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addRoutes($routes)
{
// routes is a ComplexType RouteArray,
// refer to wsdl for more info
$routes = new SOAP_Value('routes', '{urn:AGProjects:NGNPro}RouteArray', $routes);
$result = $this->call('addRoutes',
$v = array('routes' => $routes),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateRoutes($routes)
{
// routes is a ComplexType RouteArray,
// refer to wsdl for more info
$routes = new SOAP_Value('routes', '{urn:AGProjects:NGNPro}RouteArray', $routes);
$result = $this->call('updateRoutes',
$v = array('routes' => $routes),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteRoutes($routes)
{
// routes is a ComplexType RouteArray,
// refer to wsdl for more info
$routes = new SOAP_Value('routes', '{urn:AGProjects:NGNPro}RouteArray', $routes);
$result = $this->call('deleteRoutes',
$v = array('routes' => $routes),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getRoutes($query)
{
// query is a ComplexType RouteQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}RouteQuery', $query);
$result = $this->call('getRoutes',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addDomain($domain)
{
// domain is a ComplexType SipDomain,
// refer to wsdl for more info
$domain = new SOAP_Value('domain', '{urn:AGProjects:NGNPro}SipDomain', $domain);
$result = $this->call('addDomain',
$v = array('domain' => $domain),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateDomain($domain)
{
// domain is a ComplexType SipDomain,
// refer to wsdl for more info
$domain = new SOAP_Value('domain', '{urn:AGProjects:NGNPro}SipDomain', $domain);
$result = $this->call('updateDomain',
$v = array('domain' => $domain),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteDomain($domain)
{
$result = $this->call('deleteDomain',
$v = array('domain' => $domain),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getDomains($query)
{
// query is a ComplexType SipDomainQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}SipDomainQuery', $query);
$result = $this->call('getDomains',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addTrustedPeer($peer)
{
// peer is a ComplexType TrustedPeer,
// refer to wsdl for more info
$peer = new SOAP_Value('peer', '{urn:AGProjects:NGNPro}TrustedPeer', $peer);
$result = $this->call('addTrustedPeer',
$v = array('peer' => $peer),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteTrustedPeer($ip)
{
$result = $this->call('deleteTrustedPeer',
$v = array('ip' => $ip),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateTrustedPeer($peer)
{
$peer = new SOAP_Value('peer', '{urn:AGProjects:NGNPro}TrustedPeer', $peer);
$result = $this->call('updateTrustedPeer',
$v = array('peer' => $peer),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getTrustedPeers($query)
{
// query is a ComplexType TrustedPeerQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}TrustedPeerQuery', $query);
$result = $this->call('getTrustedPeers',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addAccount($account)
{
// account is a ComplexType SipAccount,
// refer to wsdl for more info
$account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}SipAccount', $account);
$result = $this->call('addAccount',
$v = array('account' => $account),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateAccount($account)
{
// account is a ComplexType SipAccount,
// refer to wsdl for more info
$account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}SipAccount', $account);
$result = $this->call('updateAccount',
$v = array('account' => $account),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteAccount($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('deleteAccount',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAccount($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getAccount',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAccounts($query)
{
// query is a ComplexType SipQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}SipQuery', $query);
$result = $this->call('getAccounts',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addAlias($alias)
{
// alias is a ComplexType SipAlias,
// refer to wsdl for more info
$alias = new SOAP_Value('alias', '{urn:AGProjects:NGNPro}SipAlias', $alias);
$result = $this->call('addAlias',
$v = array('alias' => $alias),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateAlias($alias)
{
// alias is a ComplexType SipAlias,
// refer to wsdl for more info
$alias = new SOAP_Value('alias', '{urn:AGProjects:NGNPro}SipAlias', $alias);
$result = $this->call('updateAlias',
$v = array('alias' => $alias),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteAlias($id)
{
// id is a ComplexType SipId,
// refer to wsdl for more info
$id = new SOAP_Value('id', '{urn:AGProjects:NGNPro}SipId', $id);
$result = $this->call('deleteAlias',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAlias($id)
{
// id is a ComplexType SipId,
// refer to wsdl for more info
$id = new SOAP_Value('id', '{urn:AGProjects:NGNPro}SipId', $id);
$result = $this->call('getAlias',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAliases($query)
{
// query is a ComplexType AliasQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}AliasQuery', $query);
$result = $this->call('getAliases',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addToGroup($sipId, $group)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('addToGroup',
$v = array('sipId' => $sipId, 'group' => $group),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &removeFromGroup($sipId, $group)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('removeFromGroup',
$v = array('sipId' => $sipId, 'group' => $group),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getGroups($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getGroups',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addBalance($sipId, $value, $description)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('addBalance',
$v = array('sipId' => $sipId, 'value' => $value, 'description' => $description),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addBalanceFromVoucher($sipId, $card)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// card is a ComplexType PrepaidCard,
// refer to wsdl for more info
$card = new SOAP_Value('card', '{urn:AGProjects:NGNPro}PrepaidCard', $card);
$result = $this->call('addBalanceFromVoucher',
$v = array('sipId' => $sipId, 'card' => $card),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getPrepaidStatus($sipIds)
{
// sipIds is a ComplexType SipIdArray,
// refer to wsdl for more info
$sipIds = new SOAP_Value('sipIds', '{urn:AGProjects:NGNPro}SipIdArray', $sipIds);
$result = $this->call('getPrepaidStatus',
$v = array('sipIds' => $sipIds),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getCreditHistory($sipId, $count)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getCreditHistory',
$v = array('sipId' => $sipId, 'count' => $count),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addPhonebookEntry($sipId, $entry)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// entry is a ComplexType PhonebookEntry,
// refer to wsdl for more info
$entry = new SOAP_Value('entry', '{urn:AGProjects:NGNPro}PhonebookEntry', $entry);
$result = $this->call('addPhonebookEntry',
$v = array('sipId' => $sipId, 'entry' => $entry),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updatePhonebookEntry($sipId, $entry)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// entry is a ComplexType PhonebookEntry,
// refer to wsdl for more info
$entry = new SOAP_Value('entry', '{urn:AGProjects:NGNPro}PhonebookEntry', $entry);
$result = $this->call('updatePhonebookEntry',
$v = array('sipId' => $sipId, 'entry' => $entry),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deletePhonebookEntry($sipId, $uri)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('deletePhonebookEntry',
$v = array('sipId' => $sipId, 'uri' => $uri),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getPhonebookEntries($sipId, $match, $range)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// match is a ComplexType PhonebookEntry,
// refer to wsdl for more info
$match = new SOAP_Value('match', '{urn:AGProjects:NGNPro}PhonebookEntry', $match);
// range is a ComplexType Range,
// refer to wsdl for more info
$range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}Range', $range);
$result = $this->call('getPhonebookEntries',
$v = array('sipId' => $sipId, 'match' => $match, 'range' => $range),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setRejectMembers($sipId, $members)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// members is a ComplexType StringArray,
// refer to wsdl for more info
$members = new SOAP_Value('members', '{urn:AGProjects:NGNPro}StringArray', $members);
$result = $this->call('setRejectMembers',
$v = array('sipId' => $sipId, 'members' => $members),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getRejectMembers($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getRejectMembers',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setAcceptRules($sipId, $rules)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// rules is a ComplexType AcceptRules,
// refer to wsdl for more info
$rules = new SOAP_Value('rules', '{urn:AGProjects:NGNPro}AcceptRules', $rules);
$result = $this->call('setAcceptRules',
$v = array('sipId' => $sipId, 'rules' => $rules),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAcceptRules($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getAcceptRules',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setBarringPrefixes($sipId, $prefixes)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// prefixes is a ComplexType StringArray,
// refer to wsdl for more info
$prefixes = new SOAP_Value('prefixes', '{urn:AGProjects:NGNPro}StringArray', $prefixes);
$result = $this->call('setBarringPrefixes',
$v = array('sipId' => $sipId, 'prefixes' => $prefixes),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getBarringPrefixes($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getBarringPrefixes',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setCallDiversions($sipId, $diversions)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// diversions is a ComplexType CallDiversions,
// refer to wsdl for more info
$diversions = new SOAP_Value('diversions', '{urn:AGProjects:NGNPro}CallDiversions', $diversions);
$result = $this->call('setCallDiversions',
$v = array('sipId' => $sipId, 'diversions' => $diversions),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getCallDiversions($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getCallDiversions',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getCalls($sipId, $query)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// query is a ComplexType CallsQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CallsQuery', $query);
$result = $this->call('getCalls',
$v = array('sipId' => $sipId, 'query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getCallStatistics($sipId, $query)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
// query is a ComplexType CallsQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CallsQuery', $query);
$result = $this->call('getCallStatistics',
$v = array('sipId' => $sipId, 'query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getSipDeviceLocations($sipIds)
{
// sipIds is a ComplexType SipIdArray,
// refer to wsdl for more info
$sipIds = new SOAP_Value('sipIds', '{urn:AGProjects:NGNPro}SipIdArray', $sipIds);
$result = $this->call('getSipDeviceLocations',
$v = array('sipIds' => $sipIds),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getSipTrace($filter)
{
// filter is a ComplexType SipTraceFilter,
// refer to wsdl for more info
$filter = new SOAP_Value('filter', '{urn:AGProjects:NGNPro}SipTraceFilter', $filter);
$result = $this->call('getSipTrace',
$v = array('filter' => $filter),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getMediaTrace($filter)
{
// filter is a ComplexType MediaTraceFilter,
// refer to wsdl for more info
$filter = new SOAP_Value('filter', '{urn:AGProjects:NGNPro}MediaTraceFilter', $filter);
$result = $this->call('getMediaTrace',
$v = array('filter' => $filter),
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getMediaSummary()
{
$result = $this->call('getMediaSummary',
$v = null,
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getMediaSessions()
{
$result = $this->call('getMediaSessions',
$v = null,
array('namespace' => 'urn:AGProjects:NGNPro:Sip',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_NGNPro_VoicemailPort extends SOAP_Client_Custom
{
function WebService_NGNPro_VoicemailPort($path = 'https://mdns.sipthor.net/ngnpro/voicemail/')
{
$this->SOAP_Client($path, 0);
}
function &addAccount($account)
{
// account is a ComplexType VoicemailAccount,
// refer to wsdl for more info
$account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}VoicemailAccount', $account);
$result = $this->call('addAccount',
$v = array('account' => $account),
array('namespace' => 'urn:AGProjects:NGNPro:Voicemail',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateAccount($account)
{
// account is a ComplexType VoicemailAccount,
// refer to wsdl for more info
$account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}VoicemailAccount', $account);
$result = $this->call('updateAccount',
$v = array('account' => $account),
array('namespace' => 'urn:AGProjects:NGNPro:Voicemail',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteAccount($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('deleteAccount',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Voicemail',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAccount($sipId)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('getAccount',
$v = array('sipId' => $sipId),
array('namespace' => 'urn:AGProjects:NGNPro:Voicemail',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setAnnouncement($sipId, $message)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:NGNPro}SipId', $sipId);
$result = $this->call('setAnnouncement',
$v = array('sipId' => $sipId, 'message' => $message),
array('namespace' => 'urn:AGProjects:NGNPro:Voicemail',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_NGNPro_EnumPort extends SOAP_Client_Custom
{
function WebService_NGNPro_EnumPort($path = 'https://mdns.sipthor.net/ngnpro/')
{
$this->SOAP_Client($path, 0);
}
function &addRange($range)
{
// range is a ComplexType EnumRange,
// refer to wsdl for more info
$range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}EnumRange', $range);
$result = $this->call('addRange',
$v = array('range' => $range),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateRange($range)
{
// range is a ComplexType EnumRange,
// refer to wsdl for more info
$range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}EnumRange', $range);
$result = $this->call('updateRange',
$v = array('range' => $range),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteRange($range)
{
// range is a ComplexType EnumRangeId,
// refer to wsdl for more info
$range = new SOAP_Value('range', '{urn:AGProjects:NGNPro}EnumRangeId', $range);
$result = $this->call('deleteRange',
$v = array('range' => $range),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getRanges($query)
{
// query is a ComplexType EnumRangeQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}EnumRangeQuery', $query);
$result = $this->call('getRanges',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addNumber($number)
{
// number is a ComplexType EnumNumber,
// refer to wsdl for more info
$number = new SOAP_Value('number', '{urn:AGProjects:NGNPro}EnumNumber', $number);
$result = $this->call('addNumber',
$v = array('number' => $number),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateNumber($number)
{
// number is a ComplexType EnumNumber,
// refer to wsdl for more info
$number = new SOAP_Value('number', '{urn:AGProjects:NGNPro}EnumNumber', $number);
$result = $this->call('updateNumber',
$v = array('number' => $number),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteNumber($enumId)
{
// enumId is a ComplexType EnumId,
// refer to wsdl for more info
$enumId = new SOAP_Value('enumId', '{urn:AGProjects:NGNPro}EnumId', $enumId);
$result = $this->call('deleteNumber',
$v = array('enumId' => $enumId),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getNumber($enumId)
{
// enumId is a ComplexType EnumId,
// refer to wsdl for more info
$enumId = new SOAP_Value('enumId', '{urn:AGProjects:NGNPro}EnumId', $enumId);
$result = $this->call('getNumber',
$v = array('enumId' => $enumId),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getNumbers($query)
{
// query is a ComplexType EnumNumberQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}EnumNumberQuery', $query);
$result = $this->call('getNumbers',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Enum',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_NGNPro_DnsPort extends SOAP_Client_Custom
{
function WebService_NGNPro_DnsPort($path = 'https://mdns.sipthor.net/ngnpro/')
{
$this->SOAP_Client($path, 0);
}
function &addZone($zone)
{
// zone is a ComplexType DnsZone,
// refer to wsdl for more info
$zone = new SOAP_Value('zone', '{urn:AGProjects:NGNPro}DnsZone', $zone);
$result = $this->call('addZone',
$v = array('zone' => $zone),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateZone($zone)
{
// zone is a ComplexType DnsZone,
// refer to wsdl for more info
$zone = new SOAP_Value('zone', '{urn:AGProjects:NGNPro}DnsZone', $zone);
$result = $this->call('updateZone',
$v = array('zone' => $zone),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteZone($zone)
{
$result = $this->call('deleteZone',
$v = array('zone' => $zone),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getZone($zone)
{
$result = $this->call('getZone',
$v = array('zone' => $zone),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getZones($query)
{
// query is a ComplexType DnsZoneQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}DnsZoneQuery', $query);
$result = $this->call('getZones',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addRecord($record)
{
// record is a ComplexType DnsRecord,
// refer to wsdl for more info
$record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsRecord', $record);
$result = $this->call('addRecord',
$v = array('record' => $record),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &addFancyRecord($record)
{
// record is a ComplexType DnsFancyRecord,
// refer to wsdl for more info
$record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsFancyRecord', $record);
$result = $this->call('addFancyRecord',
$v = array('record' => $record),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateRecord($record)
{
// record is a ComplexType DnsRecord,
// refer to wsdl for more info
$record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsRecord', $record);
$result = $this->call('updateRecord',
$v = array('record' => $record),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateFancyRecord($record)
{
// record is a ComplexType DnsFancyRecord,
// refer to wsdl for more info
$record = new SOAP_Value('record', '{urn:AGProjects:NGNPro}DnsFancyRecord', $record);
$result = $this->call('updateFancyRecord',
$v = array('record' => $record),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteRecord($recordId)
{
$result = $this->call('deleteRecord',
$v = array('recordId' => $recordId),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteFancyRecord($recordId)
{
$result = $this->call('deleteFancyRecord',
$v = array('recordId' => $recordId),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getRecord($recordId)
{
$result = $this->call('getRecord',
$v = array('recordId' => $recordId),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getFancyRecord($recordId)
{
$result = $this->call('getFancyRecord',
$v = array('recordId' => $recordId),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getRecords($query)
{
// query is a ComplexType DnsRecordQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}DnsRecordQuery', $query);
$result = $this->call('getRecords',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getFancyRecords($query)
{
// query is a ComplexType DnsFancyRecordQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}DnsFancyRecordQuery', $query);
$result = $this->call('getFancyRecords',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Dns',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_NGNPro_RatingPort extends SOAP_Client_Custom
{
function WebService_NGNPro_RatingPort($path = 'https://mdns.sipthor.net/ngnpro/')
{
$this->SOAP_Client($path, 0);
}
function &setEntityProfiles($profiles)
{
// profiles is a ComplexType RatingEntityProfiles,
// refer to wsdl for more info
$profiles = new SOAP_Value('profiles', '{urn:AGProjects:NGNPro}RatingEntityProfiles', $profiles);
$result = $this->call('setEntityProfiles',
$v = array('profiles' => $profiles),
array('namespace' => 'urn:AGProjects:NGNPro:Rating',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteEntityProfiles($entity)
{
$result = $this->call('deleteEntityProfiles',
$v = array('entity' => $entity),
array('namespace' => 'urn:AGProjects:NGNPro:Rating',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getEntityProfiles($entity)
{
$result = $this->call('getEntityProfiles',
$v = array('entity' => $entity),
array('namespace' => 'urn:AGProjects:NGNPro:Rating',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_NGNPro_CustomerPort extends SOAP_Client_Custom
{
function WebService_NGNPro_CustomerPort($path = 'https://mdns.sipthor.net/ngnpro/')
{
$this->SOAP_Client($path, 0);
}
function &addAccount($account)
{
// account is a ComplexType CustomerAccount,
// refer to wsdl for more info
$account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}CustomerAccount', $account);
$result = $this->call('addAccount',
$v = array('account' => $account),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &updateAccount($account)
{
// account is a ComplexType CustomerAccount,
// refer to wsdl for more info
$account = new SOAP_Value('account', '{urn:AGProjects:NGNPro}CustomerAccount', $account);
$result = $this->call('updateAccount',
$v = array('account' => $account),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deleteAccount($id)
{
$result = $this->call('deleteAccount',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getAccount($id)
{
$result = $this->call('getAccount',
$v = array('id' => $id),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getCustomers($query)
{
// query is a ComplexType CustomerQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CustomerQuery', $query);
$result = $this->call('getCustomers',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getResellers($query)
{
// query is a ComplexType CustomerQuery,
// refer to wsdl for more info
$query = new SOAP_Value('query', '{urn:AGProjects:NGNPro}CustomerQuery', $query);
$result = $this->call('getResellers',
$v = array('query' => $query),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setProperties($customer, $properties)
{
// properties is a ComplexType CustomerPropertyArray,
// refer to wsdl for more info
$properties = new SOAP_Value('properties', '{urn:AGProjects:NGNPro}CustomerPropertyArray', $properties);
$result = $this->call('setProperties',
$v = array('customer' => $customer, 'properties' => $properties),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getProperties($customer)
{
$result = $this->call('getProperties',
$v = array('customer' => $customer),
array('namespace' => 'urn:AGProjects:NGNPro:Customer',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_NGNPro_NetworkPort extends SOAP_Client_Custom
{
function WebService_NGNPro_NetworkPort($path = 'https://mdns.sipthor.net/ngnpro/')
{
$this->SOAP_Client($path, 0);
}
function &getStatistics()
{
$result = $this->call('getStatistics',
$v = null,
array('namespace' => 'urn:AGProjects:NGNPro:Network',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getStatus()
{
$result = $this->call('getStatus',
$v = null,
array('namespace' => 'urn:AGProjects:NGNPro:Network',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
class WebService_SoapSIMPLEProxy_PresencePort extends SOAP_Client_Custom
{
function WebService_SoapSIMPLEProxy_PresencePort($path)
{
$this->SOAP_Client($path, 0);
}
function &setPresenceInformation($sipId, $password, $information)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId);
// information is a ComplexType PresenceInformation,
// refer to wsdl for more info
$information = new SOAP_Value('information', '{urn:AGProjects:SoapSIMPLEProxy}PresenceInformation', $information);
$result = $this->call('setPresenceInformation',
$v = array('sipId' => $sipId, 'password' => $password, 'information' => $information),
array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getPresenceInformation($sipId, $password)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId);
$result = $this->call('getPresenceInformation',
$v = array('sipId' => $sipId, 'password' => $password),
array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &deletePresenceInformation($sipId, $password)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId);
$result = $this->call('deletePresenceInformation',
$v = array('sipId' => $sipId, 'password' => $password),
array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getWatchers($sipId, $password)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId);
$result = $this->call('getWatchers',
$v = array('sipId' => $sipId, 'password' => $password),
array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &setPolicy($sipId, $password, $policy)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId);
// policy is a ComplexType PresencePolicy,
// refer to wsdl for more info
$policy = new SOAP_Value('policy', '{urn:AGProjects:SoapSIMPLEProxy}PresencePolicy', $policy);
$result = $this->call('setPolicy',
$v = array('sipId' => $sipId, 'password' => $password, 'policy' => $policy),
array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
function &getPolicy($sipId, $password)
{
// sipId is a ComplexType SipId,
// refer to wsdl for more info
$sipId = new SOAP_Value('sipId', '{urn:AGProjects:SoapSIMPLEProxy}SipId', $sipId);
$result = $this->call('getPolicy',
$v = array('sipId' => $sipId, 'password' => $password),
array('namespace' => 'urn:AGProjects:SoapSIMPLEProxy:Presence',
'soapaction' => '',
'style' => 'rpc',
'use' => 'encoded'));
return $result;
}
}
?>
diff --git a/library/provisioning_statistics.php b/library/provisioning_statistics.php
index fa19bbb..22d1269 100644
--- a/library/provisioning_statistics.php
+++ b/library/provisioning_statistics.php
@@ -1,636 +1,636 @@
setTime(23, 59, 00); // reset time part, to prevent partial comparison
if ($stop_date == $today) {
$new_stop_date = $stop_date->add(new DateInterval('P1D'));
} else {
$new_stop_date = $stop_date;
}
$db = new $class();
$start = (float) array_sum(explode(' ', microtime()));
$query = sprintf(
"select port, sum(number) as number
from (
select substring_index(function,':',1) as port, sum(total) as number
from ngnpro_logs_functions
where
date between '%s' and '%s'
group by port
union all
select substring_index(function,':',1) as port, sum(total) as number
from ngnpro_logs_functions_history
where
date between '%s' and '%s'
group by port
) t
group by port
order by number desc limit 0,5",
$start_date->format('Y-m-d 00:00:00'),
$new_stop_date->format('Y-m-d 00:00:00'),
$start_date->format('Y-m-d 00:00:00'),
$new_stop_date->format('Y-m-d 00:00:00')
);
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if (!$db->num_rows()) {
return array();
}
$requests['total'] = 0;
while ($db->next_record()) {
$temp[$db->f('port')] = intval($db->f('number'));
$requests['total'] = intval($db->f('number')) + $requests['total'];
}
dprint_r($requests);
foreach ($temp as $key => $value) {
$query = sprintf(
"select sum(number) as number, function, port, method
from (
select sum(total) as number, function, substring_index(function,':',1) as port,substring_index(function,':',-1) as method
from ngnpro_logs_functions
where
function like '$key:%%'
and
date between '%s' and '%s'
group by function
union all
select sum(total) as number, function, substring_index(function,':',1) as port,substring_index(function,':',-1) as method
from ngnpro_logs_functions_history
where
function like '$key:%%'
and
date between '%s' and '%s'
group by function
) t
group by function
order by number desc limit 0,5",
$start_date->format('Y-m-d 00:00:00'),
$new_stop_date->format('Y-m-d 00:00:00'),
$start_date->format('Y-m-d 00:00:00'),
$new_stop_date->format('Y-m-d 00:00:00')
);
#$query = "select sum(total) as number, function, substring_index(function,':',1) as port,substring_index(function,':',-1) as method from ngnpro_logs_functions where function like '$key:%' group by function order by number desc limit 0,5 ";
dprint_sql("$query");
if (!$db->query($query)) {
$log=sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if (!$db->num_rows()) {
return array();
}
$requests[$key]['total'] = 0;
while ($db->next_record()) {
$requests[$db->f('port')][$db->f('method')] = intval($db->f('number'));
$requests[$db->f('port')]['total'] = $requests[$db->f('port')]['total'] + intval($db->f('number'));
}
}
$end = (float) array_sum(explode(' ', microtime()));
dprint("Processing time: ". sprintf("%.4f", ($end-$start))." seconds ");
$start = (float) array_sum(explode(' ', microtime()));
$query = sprintf(
"select sum(number) as number,function, ip
from
(
select total as number, function, ip
from ngnpro_logs_functions
where
date between '%s' and '%s'
group by ip,function
union all
select total as number, function, ip
from ngnpro_logs_functions_history
where
date between '%s' and '%s'
group by ip,function
) t
group by ip,function",
$start_date->format('Y-m-d 00:00:00'),
$new_stop_date->format('Y-m-d 00:00:00'),
$start_date->format('Y-m-d 00:00:00'),
$new_stop_date->format('Y-m-d 00:00:00')
);
#$query ="select total as number, function, ip from ngnpro_logs_functions group by ip,function order by number desc";
dprint_sql("$query");
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if (!$db->num_rows()) {
return array();
}
while ($db->next_record()) {
list($port,$method) = explode(":", $db->f('function'));
$requests_ip[$port][$method][$db->f('ip')] = intval($db->f('number'));
}
$end = (float) array_sum(explode(' ', microtime()));
dprint("Processing time for getTopRequestsProvisioningNew: ". sprintf("%.4f", ($end-$start))." seconds");
return array($requests,$requests_ip);
}
public function getNumber($class, $start_date, $stop_date)
{
global $CDRTool;
$temp = array();
if (!class_exists($class)) {
return array();
}
$db = new $class();
// Get total
$query = "select sum(total) as total from ngnpro_logs where date between '". $start_date->format('Y-m-d H:i:s')."' and '".$stop_date->format('Y-m-d H:i:s')."'";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if (!$db->num_rows()) {
return array();
}
while ($db->next_record()) {
$temp = array($db->f('total'));
}
dprint_r($temp);
// Also get from archived entries
$query = "select sum(total) as total from ngnpro_logs_summary where date between '". $start_date->format('Y-m-d H:i:s')."' and '".$stop_date->format('Y-m-d H:i:s')."'";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if (!$db->num_rows()) {
return array();
}
while ($db->next_record()) {
$temp[0] = $temp[0]+$db->f('total');
}
return $temp;
}
public function getData($requests, $data1)
{
$port_data = array();
$port_data['name'] = "";
$port_data['children'] = array();
foreach ($requests as $key => $value) {
if ($key != 'total') {
$children1 = array();
foreach ($requests[$key] as $key1 => $value1) {
if ($key1 != 'total') {
$children2 = array();
foreach ($data1[$key][$key1] as $key2 => $value2) {
$children2[] = array('name'=> "$key2", 'size'=>$value2);
}
$children1[] = array(
"name" => $key1,
"children" => $children2
);
}
}
$port_data['children'][]=array('name' =>$key, 'children' => $children1);
}
}
$return=json_encode($port_data);
return $return;
}
public function printChartDonut($titlex, $good_data)
{
// Create the chart
print "$titlex ";
print "
";
$chart = "
";
print $chart;
}
private function purge($class)
{
global $CDRTool;
$interval = 547;
if (!class_exists($class)) {
return array();
}
$db = new $class();
$query = "insert into ngnpro_logs_summary (total, date,total_time) "
. "select sum(total) as number, date, sum(total_time) as data from ngnpro_logs "
. "where date < DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY UNIX_TIMESTAMP(date) DIV 3600 order by date";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
$query = "delete from ngnpro_logs "
."where date < DATE_SUB(NOW(), INTERVAL 30 DAY)";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
$query = sprintf("delete from ngnpro_logs_summary where date < date_sub(now(), interval %u day)", $interval);
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
$query = sprintf("delete from ngnpro_logs_functions where date < date_sub(now(), interval %u day)", $interval);
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
$query = sprintf("delete from ngnpro_logs_functions_history where date < date_sub(now(), interval %u day)", $interval);
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
}
public function getRequestsProvisioning($class, $days, $start_date, $stop_date)
{
global $CDRTool;
$requests = array();
$period = '300';
$this->purge($class);
if (!class_exists($class)) {
return array();
}
$db = new $class();
if ($days >= 10) {
$period='600';
} else if ($days >= 20) {
$period='900';
}
$query = "select total as number,date from ngnpro_logs_summary where date between '"
. $start_date->format('Y-m-d H:i:s')
. "' and '"
. $stop_date->format('Y-m-d H:i:s')
. "' order by date";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if ($db->num_rows()) {
while ($db->next_record()) {
$requests[] = array($db->f('date'),(intval($db->f('number')))/60);
}
}
$query = "select sum(total) as number,date from ngnpro_logs where date between '"
. $start_date->format('Y-m-d H:i:s')
. "' and '"
. $stop_date->format('Y-m-d H:i:s')
. "' GROUP BY UNIX_TIMESTAMP(date) DIV $period";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if ($db->num_rows()) {
while ($db->next_record()) {
$requests[] = array($db->f('date'),(intval($db->f('number')))/($period/60));
}
}
return json_encode($requests);
}
public function getRequestsTime($class, $days, $start_date, $stop_date)
{
global $CDRTool;
$requests = array();
$period = '300';
if (!class_exists($class)) {
return array();
}
$start = (float) array_sum(explode(' ', microtime()));
$db = new $class();
if ($days >= 10) {
$period='600';
} else if ($days >= 20) {
$period='900';
}
//else if ($days > 20) {
// $period='2400';
// }
$query = "select total as number, date, total_time as data from ngnpro_logs_summary where date between '"
. $start_date->format('Y-m-d H:i:s')
. "' and '"
. $stop_date->format('Y-m-d H:i:s')
. "' order by date ";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if ($db->num_rows()) {
while ($db->next_record()) {
$total= $db->f('data');
$requests[] = array($db->f('date'),($total/intval($db->f('number')))*1000);
}
}
#$query = "select sum(total) as number, date, concat('[',group_concat(data),']') as data from ngnpro_logs_new GROUP BY UNIX_TIMESTAMP(date) DIV 60 order by date";
$query = "select sum(total) as number, date, sum(total_time) as data from ngnpro_logs where date between '"
. $start_date->format('Y-m-d H:i:s')
. "' and '"
. $stop_date->format('Y-m-d H:i:s')
. "' GROUP BY UNIX_TIMESTAMP(date) DIV $period order by date";
dprint_sql($query);
if (!$db->query($query)) {
$log = sprintf("Database error for query %s: %s (%s)", $query, $db->Error, $db->Errno);
print $log;
syslog(LOG_NOTICE, $log);
return array();
}
if ($db->num_rows()) {
while ($db->next_record()) {
$total= $db->f('data');
$requests[] = array($db->f('date'),($total/intval($db->f('number')))*1000);
}
}
$end = (float) array_sum(explode(' ', microtime()));
dprint(" Processing time for getRequestsTime: ". sprintf("%.4f", ($end-$start))." seconds ");
// echo "";
// print_r($requests);
// echo " ";
return json_encode($requests);
}
public function printLineCharts($name, $requests, $requests_time)
{
$chart = "
Number of provisioning Requests
Average execution time per request
";
print $chart;
}
}
?>
diff --git a/library/rating.php b/library/rating.php
index 67c1adf..fd6124a 100644
--- a/library/rating.php
+++ b/library/rating.php
@@ -1,9584 +1,9584 @@
db = $db;
$this->settings = $settings;
if ($this->database_backend == "mysql") {
$this->db->Halt_On_Error="no";
}
if ($this->settings['priceDenominator']) {
$this->priceDenominator = $this->settings['priceDenominator'];
}
if ($this->settings['priceDecimalDigits']) {
$this->priceDecimalDigits = $this->settings['priceDecimalDigits'];
}
if ($this->settings['durationPeriodRated']) {
$this->durationPeriodRated = $this->settings['durationPeriodRated'];
}
if ($this->settings['trafficSizeRated']) {
$this->trafficSizeRated = $this->settings['trafficSizeRated'];
}
if ($this->settings['rate_longer_than']) {
// if call is shorter than this, it has zero cost
$this->rate_longer_than = $this->settings['rate_longer_than'];
}
if ($this->settings['min_duration']) {
// if call is shorter than this, it has zero cost
$this->min_duration = $this->settings['min_duration'];
}
if ($this->settings['increment']) {
$this->increment = $this->settings['increment'];
}
if ($this->settings['database_backend']) {
$this->database_backend = $this->settings['database_backend'];
}
}
public function calculateAudio($dictionary)
{
// used for calculate rate for audio application
$this->RatingTables = $dictionary['RatingTables'];
$this->callId = $dictionary['callId'];
$this->timestamp = $dictionary['timestamp'];
$this->duration = $dictionary['duration'];
$this->traffic = 2 * ($dictionary['inputTraffic'] + $dictionary['outputTraffic']);
$this->DestinationId = $dictionary['DestinationId'];
$this->BillingPartyId = $dictionary['BillingPartyId'];
$this->domain = $dictionary['domain'];
$this->gateway = $dictionary['gateway'];
$this->ResellerId = $dictionary['ResellerId'];
$this->aNumber = $dictionary['aNumber'];
$this->cNumber = $dictionary['cNumber'];
$this->ENUMtld = $dictionary['ENUMtld'];
if ($this->rate_longer_than && $this->duration < $this->rate_longer_than) {
//syslog(LOG_NOTICE, "Duration less than minimum $this->rate_longer_than");
$this->rateInfo .= " Duration < $this->rate_longer_than s\n";
return true;
}
if ($this->ENUMtld && $this->ENUMtld != 'n/a' && $this->ENUMtld != 'none' && $this->RatingTables->ENUMtlds[$this->ENUMtld]) {
$this->ENUMdiscount = $this->RatingTables->ENUMtlds[$this->ENUMtld]['discount'];
if (!is_numeric($this->ENUMdiscount) || $this->ENUMdiscount < 0 || $this->ENUMdiscount > 100) {
syslog(LOG_NOTICE, "Error: ENUM discount for tld $this->ENUMtld must be between 0 and 100");
}
}
if (!$this->gateway) {
$this->gateway = "0.0.0.0";
}
if (!$this->duration) {
$this->duration = 0;
}
if (!$this->traffic) {
$this->traffic = 0;
}
$this->application=$dictionary['application'];
if (!$this->application) {
$this->application = 'audio';
}
$durationRate = 0;
$foundRates = array();
if (!$this->DestinationId) {
syslog(LOG_NOTICE, "Error: Cannot calculate rate without destination id for callid=$this->callId");
return false;
}
if (!$this->lookupDestinationDetails()) {
// get region, increment and other per destination details
syslog(LOG_NOTICE, "Error: Cannot find destination details for call_id=$this->callId, dest_id=$this->DestinationId)");
return false;
}
if (!$this->lookupProfiles()) {
// get profiles for the billing party
syslog(LOG_NOTICE, "Error: Cannot find any profiles for call_id=$this->callId, dest_id=$this->DestinationId)");
return false;
}
// lookup discounts if any
$this->lookupDiscounts();
$this->startTimeBilling = getLocalTime($this->billingTimezone, $this->timestamp);
list($dateText,$timeText) = explode(" ", trim($this->startTimeBilling));
$Bdate = explode("-", $dateText);
$Btime = explode(":", $timeText);
$this->timestampBilling = mktime($Btime[0], $Btime[1], $Btime[2], $Bdate[1], $Bdate[2], $Bdate[0]);
$this->startTimeBilling = Date("Y-m-d H:i:s", $this->timestampBilling);
$this->trafficKB = number_format($this->traffic/1024, 0, "", "");
// check min_duration and increment per destination
if ($this->increment >= 1) {
// increase the billed duration to the next increment
$this->duration = $this->increment * ceil($this->duration / $this->increment);
}
if ($this->max_duration && $this->duration > $this->max_duration) {
// limit the maximum duration for rating
$this->duration = $this->max_duration;
}
$this->rateSyslog = "";
if ($this->duration) {
if ($this->increment >= 1) {
$this->rateInfo .=
" Increment: $this->increment s\n";
$this->rateSyslog .= sprintf("Increment=%s ", $this->increment);
}
if ($this->min_duration) {
$this->rateInfo .=
" Min duration: $this->min_duration s\n";
$this->rateSyslog .= sprintf("MinDuration=%s ", $this->min_duration);
}
if ($this->max_duration) {
$this->rateInfo .=
" Max duration: $this->max_duration s\n";
$this->rateSyslog .= sprintf("MaxDuration=%s ", $this->max_duration);
}
if ($this->max_price) {
$this->rateInfo .=
" Max price: $this->max_price\n";
$this->rateSyslog .= sprintf("MaxPrice=%s ", $this->max_price);
}
unset($IntervalsForPricing);
$this->rateInfo .=
" Duration: $this->duration s\n".
" App: $this->application\n".
" Destination: $this->DestinationId\n".
" Customer: $this->CustomerProfile\n";
if ($this->region) {
$this->rateInfo .=
" Region: $this->region\n";
}
if ($this->discount_duration || $this->discount_connect) {
$this->rateInfo .=
" Discount: ";
}
if ($this->discount_connect) {
$this->rateInfo .= " connect $this->discount_connect% ";
}
if ($this->discount_duration) {
$this->rateInfo .= " duration $this->discount_duration% ";
}
if ($this->discount_duration || $this->discount_connect) {
$this->rateInfo .= "\n";
}
if ($this->ENUMtld && $this->ENUMtld != 'none' && $this->ENUMtld != 'n/a') {
$this->rateInfo .=
" ENUM tld: $this->ENUMtld\n".
" ENUM discount: $this->ENUMdiscount%\n";
}
$i=0;
$durationRatedTotal=0;
// get recursively a set of arrays with rates
// until we billed the whole duration
while ($durationRatedTotal < $this->duration) {
if ($i == "0") {
$dayofweek = date("w", $this->timestampBilling);
$hourofday = date("G", $this->timestampBilling);
$dayofyear = date("Y-m-d", $this->timestampBilling);
} else {
$dayofweek = date("w", $this->timestampBilling+$durationRatedTotal);
$hourofday = $foundRate['nextHourOfDay'];
$dayofyear = date("Y-m-d", $this->timestampBilling+$durationRatedTotal);
}
$foundRate = $this->lookupRateAudio($dayofyear, $dayofweek, $hourofday, $durationRatedTotal);
$durationRatedTotal = $durationRatedTotal + $foundRate['duration'];
if (!$foundRate['rate']) {
$this->broken_rate=true;
return false;
}
$foundRates[] = $foundRate;
$i++;
if ($i > 10) {
// possible loop because of wrong coding make sure we end this loop somehow
$body="Rating of call $this->callId (DestId=$this->DestinationId) has more than 10 spans. It could be a serious bug.\n";
mail($this->toEmail, "CDRTool rating problem", $body, $this->extraHeaders);
syslog(LOG_NOTICE, "Error: Rating of call $this->callId (DestId=$this->DestinationId) has more than 10 spans.");
break;
}
}
}
$j = 0;
$span = 0;
foreach ($foundRates as $thisRate) {
$spanPrice = 0;
$span++;
if ($j > 0) {
$payConnect = 0;
$durationForRating = $thisRate['duration'];
} else {
$payConnect=1;
if ($this->min_duration && $this->duration < $this->min_duration) {
$durationForRating = $this->min_duration;
} else {
$durationForRating = $thisRate['duration'];
}
}
$connectCost = $thisRate['values']['connectCost'];
$durationRate = $thisRate['values']['durationRate'];
// apply discounts for connect
if ($this->discount_connect) {
$connectCost = $connectCost - $connectCost * $this->discount_connect / 100;
}
// apply discounts for duration
if ($this->discount_duration) {
$durationRate = $durationRate - $durationRate * $this->discount_duration / 100;
}
$connectCostIn = $thisRate['values']['connectCostIn'];
$durationRateIn = $thisRate['values']['durationRateIn'];
if ($span=="1") {
$connectCostSpan = $connectCost;
$this->connectCost = number_format($connectCost/$this->priceDenominator, $this->priceDecimalDigits);
$connectCostSpanIn = $connectCostIn;
$this->connectCostIn = number_format($connectCostIn/$this->priceDenominator, $this->priceDecimalDigits);
} else {
$connectCostSpan=0;
$connectCostSpanIn=0;
}
$connectCostPrint = number_format($connectCostSpan/$this->priceDenominator, $this->priceDecimalDigits);
$durationRatePrint = number_format($durationRate/$this->priceDenominator, $this->priceDecimalDigits);
$connectCostPrintIn = number_format($connectCostSpanIn/$this->priceDenominator, $this->priceDecimalDigits);
$durationRatePrintIn = number_format($durationRateIn/$this->priceDenominator, $this->priceDecimalDigits);
if (!$connectCostSpan) $connectCostSpan=0;
if (!$durationRate) $durationRate=0;
if (!$connectCostSpanIn) $connectCostSpanIn=0;
if (!$durationRateIn) $durationRateIn=0;
if (!$this->inputTraffic) $this->inputTraffic=0;
if (!$this->outputTraffic) $this->outputTraffic=0;
if ($span>1) $this->rateInfo .= "--\n";
/*
durationRate*durationForRating/durationPeriodRated/priceDenominator+
trafficRate/priceDenominator/trafficSizeRated*(inputTraffic+outputTraffic)/8");
$durationRate*$durationForRating/$this->durationPeriodRated/$this->priceDenominator+
$trafficRate/$this->priceDenominator/$this->trafficSizeRated*($this->inputTraffic+$this->outputTraffic)/8");
*/
$spanPrice = $durationRate * $durationForRating / $this->durationPeriodRated / $this->priceDenominator;
$this->price = $this->price+$spanPrice;
$spanPricePrint = number_format($spanPrice, $this->priceDecimalDigits);
$spanPriceIn = $durationRateIn * $durationForRating / $this->durationPeriodRated / $this->priceDenominator;
$this->priceIn = $this->priceIn+$spanPriceIn;
$spanPricePrintIn = number_format($spanPriceIn, $this->priceDecimalDigits);
if ($span=="1" && $thisRate['profile']) {
if ($connectCostIn) {
$this->rateInfo .=
" Connect in: $connectCostPrintIn\n";
}
$this->rateInfo .=
" Connect: $connectCostPrint\n".
" StartTime: $this->startTimeBilling\n".
"--\n";
$this->rateSyslog .= "ConnectFee=$connectCostPrint ";
$this->price = $this->price + $connectCostSpan / $this->priceDenominator * $payConnect;
$this->priceIn = $this->priceIn + $connectCostSpanIn / $this->priceDenominator * $payConnect;
}
$this->rateInfo .=
" Span: $span\n".
" Duration: $durationForRating s\n";
$this->rateSyslog .= sprintf(
"CallId=%s Span=%s Duration=%s DestId=%s %s",
$this->callId,
$span,
$durationForRating,
$this->DestinationId,
$thisRate['customer']
);
if ($thisRate['profile']) {
$this->rateInfo .=
" ProfileId: $thisRate[profile] / $thisRate[day]\n".
" RateId: $thisRate[rate] / $thisRate[interval]h\n".
" Rate: $durationRatePrint / $this->durationPeriodRated s\n".
" Price: $spanPricePrint\n";
if ($spanPriceIn) {
$this->rateInfo .=
" Price in: $spanPricePrintIn\n";
}
$this->rateSyslog .= sprintf(
" Profile=%s Period=%s Rate=%s Interval=%s Cost=%s/%s",
$thisRate['profile'],
$thisRate['day'],
$thisRate['rate'],
$thisRate['interval'],
$durationRatePrint,
$this->durationPeriodRated
);
} else {
$this->rateInfo .=
" ProfileId: none\n".
" RateId: none\n";
$this->rateSyslog .= " Profile=none, Rate=none";
}
$this->rateSyslog .= " Price=".sprintf("%.4f", $spanPrice);
$this->rateSyslog .= " PriceIn=".sprintf("%.4f", $spanPriceIn);
if ($this->discount_connect) {
$this->rateSyslog .= sprintf(" DisCon=%s", $this->discount_connect);
}
if ($this->discount_duration) {
$this->rateSyslog .= sprintf(" DisDur=%s", $this->discount_duration);
}
syslog(LOG_NOTICE, $this->rateSyslog);
$j++;
}
if ($this->priceIn) {
$this->rateInfo .= "--\n".
" Price out: ".sprintf("%.4f", $this->price)."\n".
" Price in: ".sprintf("%.4f", $this->priceIn)."\n".
" Margin: ".sprintf("%.4f", $this->price-$this->priceIn)."\n";
}
$this->rateInfo=trim($this->rateInfo);
if ($this->max_price && $this->price > $this->max_price) {
$this->price = $this->max_price;
}
if ($this->ENUMdiscount) {
$this->priceBeforeDiscount = sprintf("%.4f", $this->price);
$this->price = $this->price - $this->price * $this->ENUMdiscount / 100;
$this->price = sprintf("%.4f", $this->price);
$this->rateInfo .=
"\n--\n".
" Total: $this->priceBeforeDiscount\n".
" Total after discount: $this->price\n";
}
$this->price = sprintf("%.4f", $this->price);
$this->pricePrint = number_format($this->price, $this->priceDecimalDigits);
return true;
}
public function calculateMessage($dictionary)
{
// used for calculate rate for SMS application
$this->RatingTables = $dictionary['RatingTables'];
$this->callId = $dictionary['callId'];
$this->timestamp = $dictionary['timestamp'];
$this->DestinationId = $dictionary['DestinationId'];
$this->BillingPartyId = $dictionary['BillingPartyId'];
$this->domain = $dictionary['domain'];
$this->gateway = $dictionary['gateway'];
$this->ResellerId = $dictionary['ResellerId'];
$this->aNumber = $dictionary['aNumber'];
$this->cNumber = $dictionary['cNumber'];
if (!$this->gateway) {
$this->gateway = "0.0.0.0";
}
$this->application = 'sms';
$foundRates=array();
if (!$this->DestinationId) {
syslog(LOG_NOTICE, "Error calculateMessage(): Cannot calculate rate without destination id");
return false;
}
if (!$this->lookupProfiles()) {
// get profiles for the billing party
syslog(LOG_NOTICE, "Error: calculateMessage() Cannot find any profiles for call_id=$this->callId, dest_id=$this->DestinationId)");
return false;
}
// lookup discounts if any
$this->lookupDiscounts();
$this->startTimeBilling = getLocalTime($this->billingTimezone, $this->timestamp);
list($dateText,$timeText) = explode(" ", trim($this->startTimeBilling));
$Bdate = explode("-", $dateText);
$Btime = explode(":", $timeText);
$this->timestampBilling = mktime($Btime[0], $Btime[1], $Btime[2], $Bdate[1], $Bdate[2], $Bdate[0]);
$dayofweek = date("w", $this->timestampBilling);
$hourofday = date("G", $this->timestampBilling);
$dayofyear = date("Y-m-d", $this->timestampBilling);
$this->rateInfo .=
" App: sms\n".
" Destination: $this->DestinationId\n".
" Customer: $this->CustomerProfile\n";
if ($this->region) {
$this->rateInfo .=
" Region: $this->region\n";
}
if ($this->discount_duration || $this->discount_connect) {
$this->rateInfo .=
" Discount: ";
}
if ($this->discount_connect) {
$this->rateInfo .= " connect $this->discount_connect% ";
}
if ($this->discount_duration || $this->discount_connect) {
$this->rateInfo .= "\n";
}
$foundRate = $this->lookupRateMessage($dayofyear, $dayofweek, $hourofday);
if (is_array($foundRate)) {
$this->price = number_format($foundRate['values']['connectCost'] / $this->priceDenominator, $this->priceDecimalDigits);
$this->price = sprintf("%.4f", $this->price);
$this->pricePrint = $this->price;
$this->rateInfo .=
" ProfileId: $foundRate[profile] / $foundRate[day]\n".
" RateId: $foundRate[rate]\n".
" Price: $this->price\n";
return true;
} else {
return false;
}
}
private function lookupDiscounts()
{
// get discounts for customer per region if set otherwise per destination id
if (!$this->CustomerProfile) {
return false;
}
if ($this->region) {
$_field = 'region';
$_value = $this->region;
} else {
$_field = 'destination';
$_value = $this->DestinationId;
}
if ($this->CustomerProfile == 'default') {
$query = sprintf(
"select * from billing_discounts
where subscriber = ''
and domain = ''
and gateway = ''
and application = '%s'
and %s = '%s'
",
addslashes($this->application),
addslashes($_field),
addslashes($_value)
);
} else {
$els = explode("=", $this->CustomerProfile);
$query = sprintf(
"select * from billing_discounts
where %s = '%s'
and application = '%s'
and %s = '%s'
",
addslashes($els[0]),
addslashes($els[1]),
addslashes($this->application),
addslashes($_field),
addslashes($_value)
);
}
// mysql backend
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$this->db->next_record();
if ($this->db->f('connect') > 0 && $this->db->f('connect') <=100) {
$this->discount_connect = $this->db->f('connect');
}
if ($this->db->f('duration') > 0 && $this->db->f('duration') <=100) {
$this->discount_duration = $this->db->f('duration');
}
}
return true;
}
private function lookupDestinationDetails()
{
// get rating related details for the destination id
if (!$this->DestinationId) {
syslog(LOG_NOTICE, "Error: Cannot lookup destination details without a destination id");
return false;
}
// mysql backend
$query = sprintf(
"select * from destinations
where dest_id = '%s'
and (reseller_id = %d or reseller_id = 0) order by reseller_id desc limit 1
",
addslashes($this->DestinationId),
addslashes($this->ResellerId)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$this->db->next_record();
$this->region = $this->db->Record['region'];
$this->max_duration = $this->db->Record['max_duration'];
$this->max_price = $this->db->Record['max_price'];
if ($this->db->Record['increment']) {
$this->increment = $this->db->Record['increment'];
}
if ($this->db->Record['min_duration']) {
$this->min_duration = $this->db->Record['min_duration'];
}
}
return true;
}
private function lookupProfiles()
{
unset($this->allProfiles);
/*
lookup the profile_name in billing_customers in the following order:
subscriber, username@gateway, domain, gateway (based on $dayofweek):
- profile_workday matches days [1-5] (Work-day)
- profile_weekend matches days [6-0] (Week-end)
- week starts with 0 Sunday and ends with 6 Saturday
Alternatively look for profile_workday_alt and profile_weekend_alt
If no rates are found for destination in the profileX,
than lookup rates in profileX_alt
*/
// mysql backend
list($username, $domain) = explode("@", $this->BillingPartyId);
$trusted_peer_account = sprintf("%s@%s", $username, $this->gateway);
$query = sprintf(
"select * from billing_customers
where
(subscriber = '%s' and domain = '' and gateway = '' )
or (subscriber = '%s' and domain = '' and gateway = '' )
or (domain = '%s' and subscriber = '' and gateway = '' )
or (gateway = '%s' and subscriber = '' and domain = '' )
or (subscriber = '' and domain = '' and gateway = '' )
order by subscriber desc, domain desc, gateway desc limit 1
",
addslashes($this->BillingPartyId),
addslashes($trusted_peer_account),
addslashes($this->domain),
addslashes($this->gateway)
);
dprint_sql($query);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$this->db->next_record();
if ($this->db->Record['subscriber']) {
if ($this->db->Record['subscriber'] == $trusted_peer_account) {
$this->CustomerProfile = sprintf("remote_account=%s", $this->db->Record['subscriber']);
} else {
$this->CustomerProfile = sprintf("local_account=%s", $this->db->Record['subscriber']);
}
} elseif ($this->db->Record['domain']) {
$this->CustomerProfile = sprintf("domain=%s", $this->db->Record['domain']);
} elseif ($this->db->Record['gateway']) {
$this->CustomerProfile = sprintf("trusted_peer=%s", $this->db->Record['gateway']);
} else {
$this->CustomerProfile = "default";
}
if (!$this->db->Record['profile_name1']) {
$log = sprintf(
"Error: customer %s (id=%d) has no weekday profile assigned in profiles table",
$this->CustomerProfile,
$this->db->Record['id']
);
syslog(LOG_NOTICE, $log);
return false;
}
if (!$this->db->Record['profile_name2']) {
$log = sprintf(
"Error: customer %s (id=%d) has no weekend profile assigned in profiles table",
$this->CustomerProfile,
$this->db->Record['id']
);
syslog(LOG_NOTICE, $log);
return false;
}
if (!$this->db->Record['timezone']) {
$log = sprintf(
"Error: missing timezone for customer %s",
$this->CustomerProfile
);
syslog(LOG_NOTICE, $log);
return false;
}
$this->billingTimezone = $this->db->Record['timezone'];
$this->allProfiles = array(
"profile_workday" => $this->db->Record['profile_name1'],
"profile_weekend" => $this->db->Record['profile_name2'],
"profile_workday_alt" => $this->db->Record['profile_name1_alt'],
"profile_weekend_alt" => $this->db->Record['profile_name2_alt'],
"timezone" => $this->db->Record['timezone']
);
if ($this->db->Record['increment']) {
$this->increment = $this->db->Record['increment'];
}
if ($this->db->Record['min_duration']) {
$this->min_duration = $this->db->Record['min_duration'];
}
return true;
} else {
$log = sprintf(
"Error: no customer found in billing_customers table for billing party=%s, domain=%s, gateway=%s",
$this->BillingPartyId,
$this->domain,
$this->gateway
);
syslog(LOG_NOTICE, $log);
return false;
}
}
private function lookupRateAudio($dayofyear, $dayofweek, $hourofday, $durationRatedAlready)
{
/*
// Required information from CDR structure
$this->BillingPartyId # calling subscriber
$this->domain # multiple callers may belong to same domain
$this->gateway # multiple callers may belong to the same gateway
$this->cNumber # E164 destination prefixed with 00 (e.g. 0041 CH)
$this->DestinationId # longest matched DestinationId
$this->region # region the destination belongs to
// pertinent to the curent rating SPAN (a span = same profile like evening hours)
$hourofday # which hour of teh day started for peak/ofpeak rates
$dayofweek # which day of the week for matching profiles
$dayofyear # which day of the year for matching holidays
$durationRatedAlready= the full duration for which a profile is defined (e.g. 0800-1800)
// the call is called recursively until the $durationRatedAlready = $CDR->duration
// when a call spans multiple profiles. If we span multiple profiles we must call
// the function again to lookup the corect rates
Rating logic
------------
1. using the profile_name found, lookup the rate_name based
on $hourofday in billing_profiles
- the day may be split in maximum 4 periods
- each day starts with hour 0 and ends with hour 24
- rate_name1 defines the first interval after hour 0
- rate_name2 defines the first interval after rate_name1
- rate_name3 defines the first interval after rate_name2
- rate_name4 defines the first interval after rate_name3
When the hour matches an interval use the rate_nameX found
to lookup the rate in billing_rates
- if no record is found use the rate called 'default'
2. lookup in billing_rates the record having same name found above
and billing_rates.destination = $this->DestinationId
- return an array with all the values to
$this->calculateAudio() function that called us
*/
// get work-day or weekend profile
if ($this->RatingTables->holidays[$dayofyear]) {
$this->profileName = $this->allProfiles['profile_weekend'];
$this->profileNameAlt = $this->allProfiles['profile_weekend_alt'];
$this->PeriodOfProfile = "weekend";
} else {
if ($dayofweek >=1 && $dayofweek <=5) {
$this->profileName = $this->allProfiles['profile_workday'];
$this->profileNameAlt = $this->allProfiles['profile_workday_alt'];
$this->PeriodOfProfile = "weekday";
} else {
$this->profileName = $this->allProfiles['profile_weekend'];
$this->profileNameAlt = $this->allProfiles['profile_weekend_alt'];
$this->PeriodOfProfile = "weekend";
}
}
// get rate for the time of the day
$timestampNextProfile = $this->timestampBilling + $durationRatedAlready;
$profileValues = $this->RatingTables->profiles[$this->profileName];
if (is_array($profileValues)) {
$this->profileNameLog = $this->profileName;
if ($hourofday < $profileValues['hour1']) {
$this->rateName = $profileValues['rate_name1'];
$this->timeInterval = "0-".$profileValues['hour1'];
$foundProfile = $profileValues['hour1'];
$this->nextProfile = $profileValues['hour1'];
} elseif ($hourofday < $profileValues['hour2']) {
$this->rateName = $profileValues['rate_name2'];
$this->timeInterval = $profileValues['hour1']."-".$profileValues['hour2'];
$foundProfile = $profileValues['hour2'];
$this->nextProfile = $profileValues['hour2'];
} elseif ($hourofday < $profileValues['hour3']) {
$this->rateName = $profileValues['rate_name3'];
$this->timeInterval = $profileValues['hour2']."-".$profileValues['hour3'];
$foundProfile = $profileValues['hour3'];
$this->nextProfile = $profileValues['hour3'];
} elseif ($hourofday < $profileValues['hour4']) {
$this->rateName = $profileValues['rate_name4'];
$this->timeInterval = $profileValues['hour3']."-".$profileValues['hour4'];
$foundProfile = $profileValues['hour4'];
$this->nextProfile = 0;
}
if ($this->rateName) {
$found_history=false;
//get historical rating if exists
if (is_array($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application])) {
$h=0;
foreach (($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application]) as $_idx) {
$h++;
if ($_idx['startDate'] <= $this->timestamp) {
if ($_idx['endDate'] > $this->timestamp) {
// found historical rate
$found_history=true;
$this->rateValues=$_idx;
break;
} else {
$_log = sprintf("Interval missmatch %s < %s", $_idx['endDate'], $this->timestamp);
continue;
}
} else {
$_log = sprintf("Interval missmatch %s > %s", $_idx['startDate'], $this->timestamp);
continue;
}
}
}
if (!$found_history) {
if ($this->region) {
$this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->region);
if (!$this->rateValues) {
// try the destination as last resort
$this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId);
}
} else {
$this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId);
}
}
}
}
$profileValuesAlt = $this->RatingTables->profiles[$this->profileNameAlt];
if (!$this->rateValues && is_array($profileValuesAlt)) {
$this->profileNameLog = $this->profileNameAlt;
if ($hourofday < $profileValuesAlt['hour1']) {
$this->rateName = $profileValuesAlt['rate_name1'];
$this->timeInterval = "0-".$profileValuesAlt['hour1'];
$foundProfile = $profileValuesAlt['hour1'];
$this->nextProfile = $profileValuesAlt['hour1'];
} elseif ($hourofday < $profileValuesAlt['hour2']) {
$this->rateName = $profileValuesAlt['rate_name2'];
$this->timeInterval = $profileValuesAlt['hour1']."-".$profileValuesAlt['hour2'];
$foundProfile = $profileValuesAlt['hour2'];
$this->nextProfile = $profileValuesAlt['hour2'];
} elseif ($hourofday < $profileValuesAlt['hour3']) {
$this->rateName = $profileValuesAlt['rate_name3'];
$this->timeInterval = $profileValuesAlt['hour2']."-".$profileValuesAlt['hour3'];
$foundProfile = $profileValuesAlt['hour3'];
$this->nextProfile = $profileValuesAlt['hour3'];
} elseif ($hourofday < $profileValuesAlt['hour4']) {
$this->rateName = $profileValuesAlt['rate_name4'];
$this->timeInterval = $profileValuesAlt['hour3']."-".$profileValuesAlt['hour4'];
$foundProfile = $profileValuesAlt['hour4'];
$this->nextProfile = 0;
}
if ($this->rateName) {
$found_history=false;
//get historical rating if exists
if (is_array($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application])) {
$h=0;
foreach (($this->RatingTables->ratesHistory[$this->rateName][$this->DestinationId][$this->application]) as $_idx) {
$h++;
if ($_idx['startDate'] <= $this->timestamp) {
if ($_idx['endDate'] > $this->timestamp) {
// found historical rate
$found_history=true;
$this->rateValues=$_idx;
break;
} else {
$_log = sprintf("Interval missmatch %s < %s", $_idx['endDate'], $this->timestamp);
continue;
}
} else {
$_log = sprintf("Interval missmatch %s > %s", $_idx['startDate'], $this->timestamp);
continue;
}
}
}
if (!$found_history) {
if ($this->region) {
$this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->region);
// try destination as last resort
if (!$this->rateValues) {
$this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId);
}
} else {
$this->rateValues = $this->lookupRateValuesAudio($this->rateName, $this->DestinationId);
}
}
}
}
if (!$this->rateValues) {
$this->rateNotFound=true;
$log = sprintf(
"Error: Cannot find rates for callid=%s, billing party=%s, customer %s, gateway=%s, destination=%s, profile=%s, app=%s",
$this->callId,
$this->BillingPartyId,
$this->CustomerProfile,
$this->gateway,
$this->DestinationId,
$this->profileName,
$this->application
);
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->nextProfile == "24") $this->nextProfile = 0;
$DST = Date("I", $timestampNextProfile);
if (!$this->nextProfile) {
// check it we change daylight saving time tomorrow
// yes this cann happen and we must apply a different rate
$timestampNextProfile =$timestampNextProfile+24*3600;
$DSTNext = Date("I", $timestampNextProfile);
if ($DST != $DSTNext) {
if ($DSTNext==0) {
$timestampNextProfile = $timestampNextProfile+3600;
} elseif ($DSTNext==1) {
$timestampNextProfile = $timestampNextProfile-3600;
}
}
}
// see if we have minimum duration or increment
if ($this->rateValues['increment']) {
// increase the billed duration to the next increment
$this->duration = $this->rateValues['increment'] * ceil($this->duration / $this->rateValues['increment']);
}
$durationToRate=$this->duration-$durationRatedAlready;
$month = Date("m", $timestampNextProfile);
$day = Date("d", $timestampNextProfile);
$year = Date("Y", $timestampNextProfile);
$nextProfileTimestamp = mktime($this->nextProfile, 0, 0, $month, $day, $year);
$npdt=Date("Y-m-d H:i", $nextProfileTimestamp);
$timeTillNextProfile = $nextProfileTimestamp - $this->timestampBilling;
if ($durationToRate > $timeTillNextProfile) {
$diff = $durationToRate - $timeTillNextProfile;
$this->durationRated = $timeTillNextProfile;
} else {
$this->durationRated = $durationToRate;
}
$rate = array(
"customer" => $this->CustomerProfile,
"application" => $this->application,
"profile" => $this->profileNameLog,
"day" => $this->PeriodOfProfile,
"destinationId" => $this->DestinationId,
"duration" => $this->durationRated,
"rate" => $this->rateName,
"values" => $this->rateValues,
"interval" => $this->timeInterval,
"nextHourOfDay" => $this->nextProfile
);
return $rate;
}
private function lookupRateMessage($dayofyear, $dayofweek, $hourofday)
{
/*
// Required information from CDR structure
$this->BillingPartyId # calling subscriber
$this->domain # multiple callers may belong to same domain
$this->gateway # multiple callers may belong to the same gateway
$this->cNumber # E164 destination prefixed with 00 (e.g. 0041 CH)
$this->DestinationId # longest matched DestinationId
$this->region # region the destination belongs to
// pertinent to the curent rating SPAN (a span = same profile like evening hours)
$hourofday # which hour of teh day started for peak/ofpeak rates
$dayofweek # which day of the week for matching profiles
$dayofyear # which day of the year for matching holidays
$durationRatedAlready= the full duration for which a profile is defined (e.g. 0800-1800)
// the call is called recursively until the $durationRatedAlready = $CDR->duration
// when a call spans multiple profiles. If we span multiple profiles we must call
// the function again to lookup the corect rates
Rating logic
------------
1. using the profile_name found, lookup the rate_name based
on $hourofday in billing_profiles
- the day may be split in maximum 4 periods
- each day starts with hour 0 and ends with hour 24
- rate_name1 defines the first interval after hour 0
- rate_name2 defines the first interval after rate_name1
- rate_name3 defines the first interval after rate_name2
- rate_name4 defines the first interval after rate_name3
When the hour matches an interval use the rate_nameX found
to lookup the rate in billing_rates
- if no record is found use the rate called 'default'
2. lookup in billing_rates the record having same name found above
and billing_rates.destination = $this->DestinationId
- return an array with all the values to
$this->calculateAudio() function that called us
*/
// get work-day or weekend profile
if ($this->RatingTables->holidays[$dayofyear]) {
$this->profileName = $this->allProfiles['profile_weekend'];
$this->profileNameAlt = $this->allProfiles['profile_weekend_alt'];
$this->PeriodOfProfile = "weekend";
} else {
if ($dayofweek >=1 && $dayofweek <=5) {
$this->profileName = $this->allProfiles['profile_workday'];
$this->profileNameAlt = $this->allProfiles['profile_workday_alt'];
$this->PeriodOfProfile = "weekday";
} else {
$this->profileName = $this->allProfiles['profile_weekend'];
$this->profileNameAlt = $this->allProfiles['profile_weekend_alt'];
$this->PeriodOfProfile = "weekend";
}
}
// get rate for the time of the day
$timestampNextProfile = $this->timestampBilling + $durationRatedAlready;
$profileValues = $this->RatingTables->profiles[$this->profileName];
if (is_array($profileValues)) {
$this->profileNameLog = $this->profileName;
if ($hourofday < $profileValues['hour1']) {
$this->rateName = $profileValues['rate_name1'];
$this->timeInterval = "0-".$profileValues['hour1'];
$foundProfile = $profileValues['hour1'];
} elseif ($hourofday < $profileValues['hour2']) {
$this->rateName = $profileValues['rate_name2'];
$this->timeInterval = $profileValues['hour1']."-".$profileValues['hour2'];
$foundProfile = $profileValues['hour2'];
} elseif ($hourofday < $profileValues['hour3']) {
$this->rateName = $profileValues['rate_name3'];
$this->timeInterval = $profileValues['hour2']."-".$profileValues['hour3'];
$foundProfile = $profileValues['hour3'];
} elseif ($hourofday < $profileValues['hour4']) {
$this->rateName = $profileValues['rate_name4'];
$this->timeInterval = $profileValues['hour3']."-".$profileValues['hour4'];
$foundProfile = $profileValues['hour4'];
}
if ($this->rateName) {
if ($this->region) {
$this->rateValues=$this->lookupRateValuesMessage($this->rateName, $this->region);
if (!$this->rateValues) {
// try the destination as last resort
$this->rateValues=$this->lookupRateValuesMessage($this->rateName, $this->DestinationId);
}
} else {
$this->rateValues=$this->lookupRateValuesMessage($this->rateName, $this->DestinationId);
}
}
}
$profileValuesAlt = $this->RatingTables->profiles[$this->profileNameAlt];
if (!$this->rateValues && is_array($profileValuesAlt)) {
$this->profileNameLog = $this->profileNameAlt;
if ($hourofday < $profileValuesAlt['hour1']) {
$this->rateName = $profileValuesAlt['rate_name1'];
$this->timeInterval = "0-".$profileValuesAlt['hour1'];
$foundProfile = $profileValuesAlt['hour1'];
} elseif ($hourofday < $profileValuesAlt['hour2']) {
$this->rateName = $profileValuesAlt['rate_name2'];
$this->timeInterval = $profileValuesAlt['hour1']."-".$profileValuesAlt['hour2'];
$foundProfile = $profileValuesAlt['hour2'];
} elseif ($hourofday < $profileValuesAlt['hour3']) {
$this->rateName = $profileValuesAlt['rate_name3'];
$this->timeInterval = $profileValuesAlt['hour2']."-".$profileValuesAlt['hour3'];
$foundProfile = $profileValuesAlt['hour3'];
} elseif ($hourofday < $profileValuesAlt['hour4']) {
$this->rateName = $profileValuesAlt['rate_name4'];
$this->timeInterval = $profileValuesAlt['hour3']."-".$profileValuesAlt['hour4'];
$foundProfile = $profileValuesAlt['hour4'];
}
if ($this->rateName) {
if ($this->region) {
$this->rateValues = $this->lookupRateValuesMessage($this->rateName, $this->region);
// try destination as last resort
if (!$this->rateValues) {
$this->rateValues = $this->lookupRateValuesMessage($this->rateName, $this->DestinationId);
}
} else {
$this->rateValues = $this->lookupRateValuesMessage($this->rateName, $this->DestinationId);
}
}
}
if (!$this->rateValues) {
$this->rateNotFound=true;
$log=sprintf(
"Error: Cannot find rates for callid=%s, billing party=%s, customer %s, gateway=%s, destination=%s, profile=%s, app=sms",
$this->callId,
$this->BillingPartyId,
$this->CustomerProfile,
$this->gateway,
$this->DestinationId,
$this->profileName
);
syslog(LOG_NOTICE, $log);
return false;
}
$rate = array(
"customer" => $this->CustomerProfile,
"application" => $this->application,
"profile" => $this->profileNameLog,
"day" => $this->PeriodOfProfile,
"destinationId" => $this->DestinationId,
"rate" => $this->rateName,
"values" => $this->rateValues,
);
return $rate;
}
public function MaxSessionTime($dictionary)
{
// Used for prepaid application to return maximum session time based on a prepaid balance
$this->rateValuesCache = array();
$this->MaxSessionTimeSpans = 0;
$durationRate = 0;
/////////////////////////////////////////////////////
// required fields passed from the CDR structure
//
$this->timestamp = time();
$this->callId = $dictionary['callId'];
$this->DestinationId = $dictionary['DestinationId'];
$this->BillingPartyId = $dictionary['BillingPartyId'];
$this->domain = $dictionary['domain'];
$this->duration = $dictionary['duration'];
$this->aNumber = $dictionary['aNumber'];
$this->cNumber = $dictionary['cNumber'];
$this->gateway = $dictionary['gateway'];
$this->RatingTables = $dictionary['RatingTables'];
$this->application = $dictionary['application'];
$this->ResellerId = $dictionary['ResellerId'];
$Balance = $dictionary['Balance'];
if (!$this->application) $this->application='audio';
if (!$this->DestinationId) {
$log = sprintf("Error: no DestinationId supplied in MaxSessionTime()");
syslog(LOG_NOTICE, $log);
return false;
}
if (!$this->lookupDestinationDetails()) {
return false;
}
if (!$this->lookupProfiles()) {
return false;
}
$this->startTimeBilling = getLocalTime($this->billingTimezone, $this->timestamp);
list($dateText,$timeText) = explode(" ", trim($this->startTimeBilling));
$Bdate = explode("-", $dateText);
$Btime = explode(":", $timeText);
$this->timestampBilling = mktime($Btime[0], $Btime[1], $Btime[2], $Bdate[1], $Bdate[2], $Bdate[0]);
$this->startTimeBilling = Date("Y-m-d H:i:s", $this->timestampBilling);
$i=0;
$durationRatedTotal=0;
while ($Balance > 0) {
$span++;
$this->MaxSessionTimeSpans++;
if ($i == "0") {
$dayofweek = date("w", $this->timestampBilling);
$hourofday = date("G", $this->timestampBilling);
$dayofyear = date("Y-m-d", $this->timestampBilling);
} else {
$dayofweek = date("w", $this->timestampBilling+$durationRatedTotal);
$hourofday = $foundRate['nextHourOfDay'];
$dayofyear = date("Y-m-d", $this->timestampBilling+$durationRatedTotal);
}
$foundRate = $this->lookupRateAudio($dayofyear, $dayofweek, $hourofday, $durationRatedTotal);
if ($this->rateNotFound) {
// break here to avoid loops
break;
}
$thisRate=$foundRate;
if ($j > 0) {
$payConnect=0;
$durationForRating = $thisRate['duration'];
} else {
$payConnect=1;
if ($this->min_duration && $this->duration < $this->min_duration) {
$durationForRating=$this->min_duration;
} else {
$durationForRating=$thisRate['duration'];
}
}
$j++;
$connectCost = $thisRate['values']['connectCost'];
$durationRate = $thisRate['values']['durationRate'];
if ($span=="1" && !$dictionary['skipConnectCost']) {
$this->connectCost=number_format($connectCost/$this->priceDenominator, $this->priceDecimalDigits);
$connectCostSpan=$connectCost;
$setupBalanceRequired=$connectCost/$this->priceDenominator;
if ($connectCost && $Balance <= $setupBalanceRequired) {
syslog(LOG_NOTICE, "Balance too small: $Balance <= $setupBalanceRequired");
return false;
}
$Balance = $Balance-$setupBalanceRequired;
} else {
$connectCostSpan=0;
$setupBalanceRequired=0;
}
$connectCostPrint = number_format($connectCostSpan/$this->priceDenominator, $this->priceDecimalDigits);
$durationRatePrint = number_format($durationRate/$this->priceDenominator, $this->priceDecimalDigits);
$spanPrice = $this->price+$setupBalanceRequired*$payConnect+
$durationRate*$durationForRating/$this->durationPeriodRated/$this->priceDenominator;
if ($Balance > $spanPrice) {
$Balance = $Balance-$spanPrice;
$durationRatedTotal = $durationRatedTotal+ $foundRate['duration'];
} else {
$durationAllowedinThisSpan = $Balance /
$durationRate * $this->durationPeriodRated * $this->priceDenominator;
$rateOfThisSpan=$durationRate/$this->priceDenominator;
$durationRatedTotal=$durationRatedTotal + $durationAllowedinThisSpan;
$Balance=$Balance-$spanPrice;
return $durationRatedTotal;
}
if ($durationRatedTotal >= $this->duration) {
return sprintf("%f", $durationRatedTotal);
}
$i++;
if ($i>10) {
return sprintf("%f", $durationRatedTotal);
break;
}
}
return false;
}
private function lookupRateValuesAudio($rateName, $DestinationId)
{
if (is_array($this->rateValuesCache[$rateName][$DestinationId][$this->application])) {
return $this->rateValuesCache[$rateName][$DestinationId][$this->application];
}
if ($this->settings['split_rating_table']) {
if ($rateName) {
$table="billing_rates_".$rateName;
} else {
$table="billing_rates_default";
}
$query = sprintf(
"select * from %s where destination = '%s' and application = '%s'",
addslashes($table),
addslashes($DestinationId),
addslashes($this->application)
);
} else {
$table = "billing_rates";
$query = sprintf(
"select * from %s where name = '%s' and destination = '%s' and application = '%s'",
addslashes($table),
addslashes($rateName),
addslashes($DestinationId),
addslashes($this->application)
);
}
// mysql backend
if (!$this->db->query($query)) {
if ($this->db->Errno != 1146) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
// try the main table
$query = sprintf(
"select * from billing_rates where name = '%s' and destination = '%s' and application = '%s'",
addslashes($rateName),
addslashes($DestinationId),
addslashes($this->application)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
}
if ($this->db->num_rows()) {
$this->db->next_record();
$values = array(
"connectCost" => $this->db->Record['connectCost'],
"durationRate" => $this->db->Record['durationRate'],
"connectCostIn" => $this->db->Record['connectCostIn'],
"durationRateIn" => $this->db->Record['durationRateIn']
);
// cache values
$this->rateValuesCache[$rateName][$DestinationId][$this->application] = $values;
return $values;
} else {
return false;
}
}
private function lookupRateValuesMessage($rateName, $DestinationId)
{
if (is_array($this->rateValuesCache[$rateName][$DestinationId]['sms'])) {
return $this->rateValuesCache[$rateName][$DestinationId]['sms'];
}
if ($this->settings['split_rating_table']) {
if ($rateName) {
$table = "billing_rates_".$rateName;
} else {
$table = "billing_rates_default";
}
$query = sprintf(
"select * from %s where (destination = '%s' or destination = '') and application = 'sms' order by destination desc limit 1",
addslashes($table),
addslashes($DestinationId)
);
} else {
$table = "billing_rates";
$query = sprintf(
"select * from %s where name = '%s' and (destination = '%s' or destination = '') and application = 'sms' order by destination desc limit 1",
addslashes($table),
addslashes($rateName),
addslashes($DestinationId)
);
}
// mysql backend
if (!$this->db->query($query)) {
if ($this->db->Errno != 1146) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
// try the main table
// lookup rate from MySQL
$query = sprintf(
"select * from billing_rates where name = '%s' and (destination = '%s' or destination = '') and application = 'sms' order by destination desc limit 1",
addslashes($rateName),
addslashes($DestinationId)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
return false;
}
}
if ($this->db->num_rows()) {
$this->db->next_record();
$values = array(
"connectCost" => $this->db->Record['connectCost']
);
// cache values
$this->rateValuesCache[$rateName][$DestinationId]['sms']=$values;
return $values;
} else {
return false;
}
}
}
class RatingTables
{
var $database_backend = 'mysql';
var $csv_export=array(
"destinations" => "destinations.csv",
"billing_customers" => "customers.csv",
"billing_profiles" => "profiles.csv",
"billing_rates" => "rates.csv",
"billing_rates_history" => "ratesHistory.csv",
"billing_discounts" => "discounts.csv",
"billing_enum_tlds" => "enumtld.csv",
"prepaid" => "prepaid.csv",
"quota_usage" => "quotausage.csv"
);
var $csv_import = array(
"destinations" => "destinations.csv",
"billing_customers" => "customers.csv",
"billing_profiles" => "profiles.csv",
"billing_rates" => "rates.csv",
"billing_rates_history" => "ratesHistory.csv",
"billing_discounts" => "discounts.csv"
);
var $previously_imported_files = 0;
var $maxrowsperpage = 15;
var $insertDomainOption = array();
var $delimiter = ",";
var $filesToImport = array();
var $importFilesPatterns = array(
'ratesHistory',
'rates',
'profiles',
'destinations',
'discounts',
'customers'
);
var $mustReload = false;
var $web_elements = array(
'table',
'export',
'web_task',
'subweb_task',
'confirmDelete',
'confirmCopy',
'next',
'id',
'search_text',
'ReloadRatingTables',
'account',
'balance',
'fromRate',
'toRate',
'sessionId'
);
var $requireReload = array('destinations');
var $whereResellerFilter = " (1=1) ";
var $cvs_import_dir = "/var/spool/cdrtool";
var $tables = array(
"destinations" => array(
"name" => "Destinations",
"skip_math" => true,
"keys" => array(
"id"
),
"exceptions" => array(),
"order" => "dest_id ASC",
"domainFilterColumn" => "domain",
"fields" => array(
"gateway" => array(
"size" => 15,
"checkType" => 'ip',
"name" => "Trusted peer"
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"domain" => array(
"size" => 15,
"name" => "Domain",
"checkType" => 'domain',
"class" => "span2"
),
"subscriber" => array(
"size" => 15,
"checkType" => 'sip_account',
"name" => "Subscriber",
"class" => "span2"
),
"dest_id" => array(
"size" => 12,
"name" => "Destination",
),
"region" => array(
"size" => 10,
"name" => "Region"
),
"dest_name" => array(
"size" => 20,
"name" => "Description",
"class" => "span2"
),
"increment" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "Incr"
),
"min_duration" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "Min Dur"
),
"max_duration" => array(
"size" => 5,
"checkType" => 'numeric',
"name" => "Max Dur"
),
"max_price" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Max Price"
)
)
),
"billing_customers" => array(
"name" => "Customers",
"skip_math" => true,
"keys" => array("id"),
"domainFilterColumn" => "domain",
"fields" => array(
"gateway" => array(
"size" => 15,
"checkType" => 'ip',
"name" => "Trusted Peer"
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"domain" => array(
"size" => 15,
"checkType" => 'domain',
"name" => "Domain",
"class" => "span2"
),
"subscriber" => array(
"size" => 25,
"checkType" => 'sip_account',
"name" => "Subscriber",
"class" => "span2"
),
"profile_name1" => array(
"size" => 10,
"name" => "Profile WD"
),
"profile_name1_alt" => array(
"size" => 8,
"name" => "Fallback"
),
"profile_name2" => array(
"size" => 10,
"name" => "Profile WE"
),
"profile_name2_alt" => array(
"size" => 8,
"name" => "Fallback"
),
"timezone" => array(
"size" => 16,
"name" => "Timezone",
"class" => "span2"
),
"increment" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "Incr"
),
"min_duration" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "Min Dur"
)
)
),
"billing_discounts" => array(
"name" => "Discounts",
"keys" => array("id"),
"domainFilterColumn" => "domain",
"fields" => array(
"gateway" => array(
"size" => 15,
"checkType" => 'ip',
"name" => "Trusted Peer"
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"domain" => array(
"size" => 15,
"checkType" => 'domain',
"name" => "Domain",
"class" => "span2"
),
"subscriber" => array(
"size" => 25,
"checkType" => 'sip_account',
"name" => "Subscriber",
"class" => "span2"
),
"application" => array(
"size" => 6,
"name" => "App"
),
"destination" => array(
"size" => 10,
"name" => "Destination"
),
"region" => array(
"size" => 8,
"name" => "Region"
),
"connect" => array(
"size" => 5,
"name" => "Connect"
),
"duration" => array(
"size" => 5,
"name" => "Duration"
)
)
),
"billing_profiles" => array(
"name" => "Profiles",
"skip_math" => true,
"keys" => array("id"),
"exceptions" => array(),
"size" => 6,
"fields" => array(
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"name" => array(
"size" => 12,
"name" => "Profile",
"class" => "span2"
),
"rate_name1" => array(
"size" => 12,
"name" => "Rate 1"
),
"hour1" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "00-H1"
),
"rate_name2" => array(
"size" => 12,
"name" => "Rate 2"
),
"hour2" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "H1-H2"
),
"rate_name3" => array(
"size" => 12,
"name" => "Rate 3"
),
"hour3" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "H2-H3"
),
"rate_name4" => array(
"size" => 12,
"name" => "Rate 4"
),
"hour4" => array(
"size" => 3,
"checkType" => 'numeric',
"name" => "H3-24"
),
)
),
"billing_rates" => array(
"name" => "Rates",
"keys" => array("id"),
"size" => 10,
"exceptions" => array('maxPrice'),
"order" => "durationRate desc",
"fields" => array(
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"name" => array(
"size" => 12,
"name" => "Rate",
"class" => "span2"
),
"destination" => array(
"size" => 12,
"name" => "Destination"
),
"application" => array(
"size" => 6,
"name" => "App"
),
"connectCost" => array(
"size" => 8,
"checkType" => 'numeric',
"name"=>"Connect"
),
"durationRate" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Duration"
),
"connectCostIn" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Conn In"
),
"durationRateIn" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Duration In"
)
)
),
"billing_rates_history" => array(
"name" => "Rates history",
"keys" => array("id"),
"size" => 10,
"order" => "destination ASC, name ASC",
"fields" => array(
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"name" => array(
"size" => 10,
"name" => "Rate",
"class" => "span2"
),
"destination" => array(
"size" => 12,
"name" => "Destination"
),
"application" => array(
"size" => 6,
"name" => "App"
),
"connectCost" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Conn"
),
"durationRate" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Price"
),
"connectCostIn" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Conn In"
),
"durationRateIn" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Price In"
),
"startDate" => array(
"size" => 11,
"name" => "Start Date",
"class" => "span2"
),
"endDate" => array(
"size" => 11,
"name" => "End Date",
"class" => "span2"
)
)
),
"billing_enum_tlds" => array(
"name" => "ENUM discounts",
"skip_math" => true,
"keys" => array("id"),
"exceptions" => array(),
"size" => 6,
"fields" => array(
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"enum_tld" => array(
"size" => 35,
"mustExist" => true,
"checkType" => 'domain',
"name" => "ENUM TLD",
"class" => "span2"
),
"e164_regexp" => array(
"size" => 35,
"mustExist" => true,
"name" => "E164 Regexp",
"class" => "span2"
),
"discount" => array(
"size" => 10,
"mustExist" => true,
"checkType" => 'numeric',
"name" => "Discount"
)
)
),
"prepaid" => array(
"name" => "Prepaid accounts",
"keys" => array("id"),
"size" => 15,
"exceptions" => array('change_date','active_sessions','domain'),
"order" => "change_date DESC",
"fields" => array(
"account" => array(
"size" => 35,
"name" => "Subscriber",
"checkType" => 'sip_account',
"mustExist" => true,
"class" => "span2"
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"balance" => array(
"size" => 10,
"name" => "Balance"
),
"change_date" => array(
"size" => 19,
"name" => "Last Change",
"readonly" => 1
),
"session_counter" => array(
"size" => 3,
"name" => "Active Sessions",
"readonly" => 1
),
"max_sessions" => array(
"size" => 3,
"name" => "Max Sessions"
)
)
),
"prepaid_cards" => array(
"name" => "Prepaid cards",
"keys" => array("id"),
"size" => 15,
"exceptions" => array('service'),
"fields" => array(
"batch" => array(
"size" => 40,
"name" => "Batch name",
"readonly" => 1,
"class" => "span3"
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller"
),
"date_batch" => array(
"size" => 11,
"name" => "Batch Date",
"class" => "span2"
),
"number" => array(
"size" => 20,
"checkType" => 'numeric',
"mustExist" => true,
"name" => "Card Number",
"class" => "span2"
),
"id" => array(
"size" => 20,
"checkType" => 'numeric',
"mustExist" => true,
"name" => "Card Id",
),
"value" => array(
"size" => 8,
"checkType" => 'numeric',
"mustExist" => true,
"name" => "Card Value"
),
"blocked" => array(
"size" => 1,
"name" => "Lock"
),
"date_active" => array(
"size" => 18,
"name" => "Activation Date",
"class" => "span2"
)
)
),
"prepaid_history" => array(
"name" => "Prepaid history",
"order" => "id DESC",
"skip_math" => true,
"keys" => array("id"),
"size" => 15,
"exceptions" => array('session','destination'),
"fields" => array(
"username" => array(
"size" => 15,
"readonly" => 1,
"class" => "span2"
),
"domain" => array(
"size" => 15,
"readonly" => 1,
"class" => "span2"
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller",
"readonly" => 1
),
"action" => array(
"size" => 15,
"readonly" => 1,
"class" => "span2"
),
"duration" => array(
"size" => 5
),
"destination" => array(
"size" => 15
),
"session" => array(
"size" => 30,
"readonly" => 1
),
"description" => array(
"size" => 30,
"class" => "span3"
),
"value" => array(
"size" => 10
),
"balance" => array(
"size" => 10
),
"date" => array(
"size" => 18,
"class" => "span2"
)
)
),
"quota_usage" => array(
"name" => "Quota usage",
"keys" => array("id"),
"size" => 15,
"readonly" => 1,
"exceptions" => array(
"change_date",
"traffic",
"duration",
"calls"
),
"domainFilterColumn" => "domain",
"fields" => array(
"datasource" => array(
"size" => 15,
"readonly" => 1
),
"reseller_id" => array(
"size" => 8,
"checkType" => 'numeric',
"name" => "Reseller",
"readonly" => true
),
"account" => array(
"size" => 30,
"readonly" => 1,
"name" => "Subscriber",
"class" => "span2"
),
"domain" => array(
"size" => 15,
"readonly" => 1,
"class" => "span2"
),
"blocked" => array(
"size" => 2,
"readonly" => 1
),
"notified" => array(
"size" => 20,
"readonly" => 1
),
"quota" => array(
"size" => 5,
"readonly" => 1
),
"cost" => array(
"size" => 10,
"readonly" => 1,
"name" => "This Month"
),
"cost_today" => array(
"size" => 10,
"readonly" => 1,
"name" => "Today"
),
"duration" => array(
"size" => 10,
"readonly" => 1
),
"calls" => array(
"size" => 10,
"readonly" => 1
),
"traffic" => array(
"size" => 20,
"readonly" => 1
)
)
)
);
public function RatingTables($readonly = false)
{
global $CDRTool;
global $RatingEngine;
$this->settings = $RatingEngine;
$this->CDRTool = $CDRTool;
$this->table = $_REQUEST['table'];
if (!$this->table || !in_array($this->table, array_keys($this->tables))) {
$this->table="destinations";
}
$this->readonly=$readonly;
if ($this->settings['csv_delimiter']) {
$this->delimiter=$this->settings['csv_delimiter'];
}
if (!strlen($this->CDRTool['filter']['customer'])) {
$this->whereResellerFilter = sprintf("reseller_id = %d", '99999999');
} else {
if ($this->CDRTool['filter']['customer'] && $this->tables[$this->table]['fields']['reseller_id']) {
$this->whereResellerFilter = sprintf("reseller_id = %d", addslashes($this->CDRTool['filter']['customer']));
$this->tables[$this->table]['fields']['reseller_id']['readonly']=true;
}
}
if ($this->settings['split_rating_table']) {
$this->tables['billing_rates']['fields']['name']['readonly'] = 1;
}
if (strlen($this->settings['socketIP'])) {
if ($this->settings['socketIP'] == '0.0.0.0' || $this->settings['socketIP'] == '0') {
$this->settings['socketIPforClients'] = '127.0.0.1';
} else {
$this->settings['socketIPforClients'] = $this->settings['socketIP'];
}
}
if ($this->settings['database_backend']) {
$this->database_backend = $this->settings['database_backend'];
}
$this->db = new DB_cdrtool;
$this->db1 = new DB_cdrtool;
$this->db->Halt_On_Error="no";
$this->db1->Halt_On_Error="no";
}
public function ImportCSVFiles($dir = false)
{
$results = 0;
if (!$dir) $dir = "/var/spool/cdrtool";
$this->scanFilesForImport($dir);
if ($this->previously_imported_files) {
printf("Skipping %d previously imported files\n", $this->previously_imported_files);
}
$results=0;
foreach (array_keys($this->filesToImport) as $file) {
$importFunction = "Import".ucfirst($this->filesToImport[$file]['type']);
printf("Reading file %s\n", $this->filesToImport[$file]['path']);
$results = $this->$importFunction($this->filesToImport[$file]['path'],$this->filesToImport[$file]['reseller']);
$this->logImport(
$dir,
$this->filesToImport[$file]['path'],
$this->filesToImport[$file]['watermark'],
$results,
$this->filesToImport[$file]['reseller']
);
}
return $results;
}
private function ImportRates($file, $reseller = 0)
{
if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false;
$i=0;
$inserted = 0;
$updated = 0;
$deleted = 0;
printf("Importing rates from %s for reseller %s:\n", $file, $reseller);
while ($buffer = fgets($fp, 1024)) {
$buffer = trim($buffer);
$p = explode($this->delimiter, $buffer);
$ops = trim($p[0]);
$name = trim($p[2]);
$destination = trim($p[3]);
$application = trim($p[4]);
$connectCost = trim($p[5]);
$durationRate = trim($p[6]);
$connectCostIn = trim($p[7]);
$durationRateIn = trim($p[8]);
if ($reseller) {
$reseller_id = intval($reseller);
} else {
$reseller_id = intval($p[1]);
}
if (!is_numeric($destination) && !strstr($destination, '@')) {
// skip invalid destinations
$skipped++;
continue;
}
if (strlen($connectCost) && !is_numeric($connectCost)) {
$skipped++;
continue;
}
if (strlen($durationRate) && !is_numeric($durationRate)) {
$skipped++;
continue;
}
if (!$application) $application='audio';
if ($ops=="1") {
$query = sprintf(
"insert into billing_rates
(
reseller_id,
name,
destination,
application,
connectCost,
durationRate,
connectCostIn,
durationRateIn
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn)
);
// mysql backend
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
if ($this->db->affected_rows()) {
if ($this->settings['split_rating_table']) {
if ($name) {
$_table = 'billing_rates_'.$name;
} else {
$_table = 'billing_rates_default';
}
if (!$this->createRatingTable($name)) {
$query = sprintf(
"insert into %s
(
id,
reseller_id,
name,
destination,
application,
connectCost,
durationRate,
connectCostIn,
durationRateIn
) values (
LAST_INSERT_ID(),
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($_table),
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
}
}
$inserted++;
} else {
$failed++;
}
} elseif ($ops == "3") {
$query = sprintf(
"delete from billing_rates
where
reseller_id = '%s'
and name = '%s'
and destination = '%s'
and application = '%s'",
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application)
);
// mysql backend
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
if ($this->settings['split_rating_table']) {
if ($name) {
$_table = 'billing_rates_'.$name;
} else {
$_table = 'billing_rates_default';
}
$query = sprintf(
"delete from %s
where reseller_id = '%s'
and name = '%s'
and destination = '%s'
and application = '%s'",
addslashes($_table),
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
}
$deleted++;
}
// mysql backend
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$query = sprintf(
"update billing_rates set
connectCost = '%s',
durationRate = '%s',
connectCostIn = '%s',
durationRateIn = '%s'
where name = '%s'
and destination = '%s'
and reseller_id = '%s'
and application = '%s'
",
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn),
addslashes($name),
addslashes($destination),
addslashes($reseller_id),
addslashes($application)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
if ($this->settings['split_rating_table']) {
if ($name) {
$_table = 'billing_rates_'.$name;
} else {
$_table = 'billing_rates_default';
}
$query = sprintf(
"update %s set
connectCost = '%s',
durationRate = '%s',
connectCostIn = '%s',
durationRateIn = '%s'
where name = '%s'
and destination = '%s'
and reseller_id = '%s'
and application = '%s'
",
addslashes($_table),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn),
addslashes($name),
addslashes($destination),
addslashes($reseller_id),
addslashes($application)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
}
$updated++;
}
} else {
$query = sprintf(
"insert into billing_rates
(
reseller_id,
name,
destination,
application,
connectCost,
durationRate,
connectCostIn,
durationRateIn
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
if ($this->settings['split_rating_table']) {
if ($name) {
$_table = 'billing_rates_'.$name;
} else {
$_table = 'billing_rates_default';
}
if (!$this->createRatingTable($name)) {
$query = sprintf(
"insert into %s
(
id,
reseller_id,
name,
destination,
application
connectCost,
durationRate,
connectCostIn,
durationRateIn
) values (
LAST_INSERT_ID(),
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($_table),
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
}
}
$inserted++;
} else {
$failed++;
}
}
} else {
$skipped++;
}
$this->showImportProgress($file);
$i++;
}
if ($i) print "Read $i records\n";
if ($skipped) print "Skipped $skipped records\n";
if ($inserted) print "Inserted $inserted records\n";
if ($updated) print "Updated $updated records\n";
if ($deleted) print "Delete $deleted records\n";
$results = $inserted+$updated+$deleted;
return $results;
}
private function ImportRatesHistory($file, $reseller = 0)
{
if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false;
$this->mustReload=true;
$i=0;
$inserted = 0;
$updated = 0;
$deleted = 0;
printf("Importing rates history from %s for reseller %s:\n", $file, $reseller);
while ($buffer = fgets($fp, 1024)) {
$buffer=trim($buffer);
$p = explode($this->delimiter, $buffer);
$ops = trim($p[0]);
$name = trim($p[2]);
$destination = trim($p[3]);
$application = trim($p[4]);
$connectCost = trim($p[5]);
$durationRate = trim($p[6]);
$connectCostIn = trim($p[7]);
$durationRateIn = trim($p[8]);
$startDate = trim($p[9]);
$endDate = trim($p[10]);
if ($reseller) {
$reseller_id = intval($reseller);
} else {
$reseller_id = intval($p[1]);
}
if (!is_numeric($destination) && !strstr($destination, '@')) {
// skip invalid destinations
$skipped++;
continue;
}
if (strlen($connectCost) && !is_numeric($connectCost)) {
$skipped++;
continue;
}
if (strlen($durationRate) && !is_numeric($durationRate)) {
$skipped++;
continue;
}
if (preg_match("/^\d{4}\-{\d{2}\-\d{2}$/", $startDate)) {
$skipped++;
continue;
}
if (preg_match("/^\d{4}\-{\d{2}\-\d{2}$/", $endDate)) {
$skipped++;
continue;
}
if ($ops=="1") {
$query = sprintf(
"insert into billing_rates_history
(
reseller_id,
name,
destination,
application,
connectCost,
durationRate,
connectCostIn,
durationRateIn,
startDate,
endDate
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn),
addslashes($startDate),
addslashes($endDate)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
} elseif ($ops=="3") {
$query = sprintf(
"delete from billing_rates_history
where reseller_id = '%s'
and name = '%s'
and destination = '%s'
and startDate = '%s'
and endDate = '%s'",
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($startDate),
addslashes($endDate)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$deleted++;
}
} elseif ($ops=="2") {
$query = sprintf(
"select * from billing_rates_history
where name = '%s'
and destination = '%s'
and reseller_id = '%s'
and startDate = '%s'
and endDate = '%s'
",
addslashes($name),
addslashes($destination),
addslashes($reseller_id),
addslashes($startDate),
addslashes($endDate)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$query = sprintf(
"update billing_rates_history set
application = '%s',
connectCost = '%s',
durationRate = '%s',
connectCostIn = '%s',
connectCostIn = '%s'
where name = '%s'
and destination = '%s'
and reseller_id = '%s'
and startDate = '%s'
and endDate = '%s'
",
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn),
addslashes($name),
addslashes($destination),
addslashes($reseller_id),
addslashes($startDate),
addslashes($endDate)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$updated++;
}
} else {
$query = sprintf(
"insert into billing_rates_history
(
reseller_id,
name,
destination,
application,
connectCost,
durationRate,
connectCostIn,
durationRateIn,
startDate,
endDate
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($name),
addslashes($destination),
addslashes($application),
addslashes($connectCost),
addslashes($durationRate),
addslashes($connectCostIn),
addslashes($durationRateIn),
addslashes($startDate),
addslashes($endDate)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
}
} else {
$skipped++;
}
$j++;
if ($j=="10000") {
flush();
$j=0;
}
$this->showImportProgress($file);
$i++;
}
if ($i) print "Read $i records\n";
if ($skipped) print "Skipped $skipped records\n";
if ($inserted) print "Inserted $inserted records\n";
if ($updated) print "Updated $updated records\n";
if ($deleted) print "Delete $deleted records\n";
$results = $inserted + $updated + $deleted;
return $results;
}
private function ImportCustomers($file, $reseller = 0)
{
if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false;
$this->mustReload = true;
$i=0;
$inserted = 0;
$updated = 0;
$deleted = 0;
printf("Importing customers from %s for reseller %s:\n", $file, $reseller);
while ($buffer = fgets($fp, 1024)) {
$buffer=trim($buffer);
$p = explode($this->delimiter, $buffer);
$ops = trim($p[0]);
$gateway = trim($p[2]);
$domain = trim($p[3]);
$subscriber = trim($p[4]);
$profile_name1 = trim($p[5]);
$profile_name1_alt = trim($p[6]);
$profile_name2 = trim($p[7]);
$profile_name2_alt = trim($p[8]);
$timezone = trim($p[9]);
if ($reseller) {
$reseller_id = intval($reseller);
} else {
$reseller_id = intval($p[1]);
}
if (strlen($reseller_id) && !is_integer($reseller_id)) {
$skipped++;
continue;
}
if ($ops=="1") {
$query = sprintf(
"insert into billing_customers
(
reseller_id,
gateway,
domain,
subscriber,
profile_name1,
profile_name2,
timezone,
profile_name1_alt,
profile_name2_alt
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($gateway),
addslashes($domain),
addslashes($subscriber),
addslashes($profile_name1),
addslashes($profile_name2),
addslashes($timezone),
addslashes($profile_name1_alt),
addslashes($profile_name2_alt)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
} elseif ($ops == "3") {
$query = sprintf(
"delete from billing_customers
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
",
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$deleted++;
}
} elseif ($ops == "2") {
$query = sprintf(
"select * from billing_customers
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
",
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$query = sprintf(
"update billing_customers set
profile_name1 = '%s',
profile_name2 = '%s',
profile_name1_alt = '%s',
profile_name2_alt = '%s',
timezone = '%s'
where gateway = '%s'
and domain = '%s'
and reseller_id = '%s'
and subscriber = '%s'\n",
addslashes($profile_name1),
addslashes($profile_name2),
addslashes($profile_name1_alt),
addslashes($profile_name2_alt),
addslashes($timezone),
addslashes($gateway),
addslashes($domain),
addslashes($reseller_id),
addslashes($subscriber)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
$updated++;
}
} else {
$query = sprintf(
"insert into billing_customers
(
reseller_id,
gateway,
domain,
subscriber,
profile_name1,
profile_name2,
timezone,
profile_name1_alt,
profile_name2_alt
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($gateway),
addslashes($domain),
addslashes($subscriber),
addslashes($profile_name1),
addslashes($profile_name2),
addslashes($timezone),
addslashes($profile_name1_alt),
addslashes($profile_name2_alt)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
$inserted++;
}
}
} else {
$skipped++;
}
$this->showImportProgress($file);
$i++;
}
if ($i) print "Read $i records\n";
if ($skipped) print "Skipped $skipped records\n";
if ($inserted) print "Inserted $inserted records\n";
if ($updated) print "Updated $updated records\n";
if ($deleted) print "Delete $deleted records\n";
$results=$inserted+$updated+$deleted;
return $results;
}
private function ImportDestinations($file, $reseller = 0)
{
if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false;
$this->mustReload=true;
$i=0;
$inserted = 0;
$updated = 0;
$deleted = 0;
printf("Importing destinations from %s for reseller %s:\n", $file, $reseller);
while ($buffer = fgets($fp, 1024)) {
$buffer=trim($buffer);
$p = explode($this->delimiter, $buffer);
$ops = trim($p[0]);
$gateway = trim($p[2]);
$domain = trim($p[3]);
$subscriber = trim($p[4]);
$dest_id = trim($p[5]);
$region = trim($p[6]);
$dest_name = trim($p[7]);
$increment = intval($p[8]);
$min_duration = intval($p[9]);
$max_duration = intval($p[10]);
$max_price = trim($p[11]);
if ($reseller) {
$reseller_id = intval($reseller);
} else {
$reseller_id = intval($p[1]);
}
if (!is_numeric($dest_id) && !strstr($dest_id, '@')) {
// skip invalid destinations
$skipped++;
continue;
}
if ($ops=="1") {
$query = sprintf(
"insert into destinations
(
reseller_id,
gateway,
domain,
subscriber,
dest_id,
region,
dest_name,
increment,
min_duration,
max_duration,
max_price
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($gateway),
addslashes($domain),
addslashes($subscriber),
addslashes($dest_id),
addslashes($region),
addslashes($dest_name),
addslashes($increment),
addslashes($min_duration),
addslashes($max_duration),
addslashes($max_price)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
} elseif ($ops == "3") {
$query = sprintf(
"delete from destinations
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
and dest_id = '%s'
",
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber),
addslashes($dest_id)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$deleted++;
}
} elseif ($ops == "2") {
$query = sprintf(
"select * from destinations
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
and dest_id = '%s'
",
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber),
addslashes($dest_id)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$query = sprintf(
"update destinations set
region = '%s',
dest_name = '%s',
increment = '%s',
min_duration = '%s',
max_duration = '%s',
max_price = '%s'
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
and dest_id = '%s'
",
addslashes($region),
addslashes($dest_name),
addslashes($increment),
addslashes($min_duration),
addslashes($max_duration),
addslashes($max_price),
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber),
addslashes($dest_id)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
$updated++;
}
} else {
$query = sprintf(
"insert into destinations
(
reseller_id,
gateway,
domain,
subscriber,
dest_id,
region,
dest_name,
increment,
min_duration,
max_duration,
max_price
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($gateway),
addslashes($domain),
addslashes($subscriber),
addslashes($dest_id),
addslashes($region),
addslashes($dest_name),
addslashes($increment),
addslashes($min_duration),
addslashes($max_duration),
addslashes($max_price)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
}
} else {
$skipped++;
}
$this->showImportProgress($file);
$i++;
}
if ($i) print "Read $i records\n";
if ($skipped) print "Skipped $skipped records\n";
if ($inserted) print "Inserted $inserted records\n";
if ($updated) print "Updated $updated records\n";
if ($deleted) print "Delete $deleted records\n";
$results = $inserted + $updated + $deleted;
return $results;
}
private function ImportDiscounts($file, $reseller = 0)
{
if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false;
$this->mustReload=true;
$i=0;
$inserted = 0;
$updated = 0;
$deleted = 0;
printf("Importing discounts from %s for reseller %s:\n", $file, $reseller);
while ($buffer = fgets($fp, 1024)) {
$buffer=trim($buffer);
$p = explode($this->delimiter, $buffer);
$ops = trim($p[0]);
$gateway = trim($p[2]);
$domain = trim($p[3]);
$subscriber = trim($p[4]);
$application = trim($p[5]);
$destination = trim($p[6]);
$region = trim($p[7]);
$connect = intval($p[8]);
$duration = intval($p[9]);
if ($reseller) {
$reseller_id = intval($reseller);
} else {
$reseller_id = intval($p[1]);
}
if (!is_numeric($destination) && !strstr($destination, '@')) {
// skip invalid destinations
$skipped++;
continue;
}
if ($ops == "1") {
$query = sprintf(
"insert into billing_discounts
(
reseller_id,
gateway,
domain,
subscriber,
application,
destination,
region,
connect,
duration
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($gateway),
addslashes($domain),
addslashes($subscriber),
addslashes($application),
addslashes($destination),
addslashes($region),
addslashes($connect),
addslashes($duration)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
} elseif ($ops == "3") {
$query=sprintf(
"delete from billing_discounts
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
and application = '%s'
and destination = '%s'
and region = '%s'
",
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber),
addslashes($application),
addslashes($destination),
addslashes($region)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$deleted++;
}
} elseif ($ops == "2") {
$query = sprintf(
"select * from billing_discounts
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
and application = '%s'
and destination = '%s'
and region = '%s'
",
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber),
addslashes($application),
addslashes($destination),
addslashes($region)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$query = sprintf(
"update billing_discounts set
connect = '%s',
duration = '%s',
where gateway = '%s'
and reseller_id = '%s'
and domain = '%s'
and subscriber = '%s'
and application = '%s'
and destination = '%s'
and region = '%s'
",
addslashes($connect),
addslashes($duration),
addslashes($gateway),
addslashes($reseller_id),
addslashes($domain),
addslashes($subscriber),
addslashes($application),
addslashes($destination),
addslashes($region)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
$updated++;
}
} else {
$query = sprintf(
"insert into billing_discounts
(
reseller_id,
gateway,
domain,
subscriber,
application,
destination,
region,
connect,
duration
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($gateway),
addslashes($domain),
addslashes($subscriber),
addslashes($application),
addslashes($destination),
addslashes($region),
addslashes($connect),
addslashes($duration)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
}
} else {
$skipped++;
}
$this->showImportProgress($file);
$i++;
}
if ($i) print "Read $i records\n";
if ($skipped) print "Skipped $skipped records\n";
if ($inserted) print "Inserted $inserted records\n";
if ($updated) print "Updated $updated records\n";
if ($deleted) print "Delete $deleted records\n";
$results = $inserted + $updated + $deleted;
return $results;
}
private function ImportProfiles($file, $reseller = 0)
{
if (!$file || !is_readable($file) || !$fp = fopen($file, "r")) return false;
$this->mustReload=true;
$i=0;
$inserted = 0;
$updated = 0;
$deleted = 0;
print "Importing Profiles:\n";
while ($buffer = fgets($fp, 1024)) {
$buffer=trim($buffer);
$p = explode($this->delimiter, $buffer);
$ops = trim($p[0]);
$profile = trim($p[2]);
$rate1 = trim($p[3]);
$hour1 = trim($p[4]);
$rate2 = trim($p[5]);
$hour2 = trim($p[6]);
$rate3 = trim($p[7]);
$hour3 = trim($p[8]);
$rate4 = trim($p[9]);
$hour4 = trim($p[10]);
if ($reseller) {
$reseller_id = intval($reseller);
} else {
$reseller_id = intval($p[1]);
}
if (!$hour1) $hour1=0;
if (!$hour2) $hour2=0;
if (!$hour3) $hour3=0;
if (!$hour4) $hour4=0;
if ($ops=="1") {
$query = sprintf(
"insert into billing_profiles
(
reseller_id,
name,
rate_name1,
hour1,
rate_name2,
hour2,
rate_name3,
hour3,
rate_name4,
hour4
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($profile),
addslashes($rate1),
addslashes($hour1),
addslashes($rate2),
addslashes($hour2),
addslashes($rate3),
addslashes($hour3),
addslashes($rate4),
addslashes($hour4)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
} elseif ($ops == "3") {
$query = sprintf(
"delete from billing_profiles
where name = '%s'
and reseller_id= '%s'
",
addslashes($profile),
addslashes($reseller_id)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$deleted++;
}
} elseif ($ops == "2") {
$query = sprintf(
"select * from billing_profiles
where name = '%s'
and reseller_id= '%s'
",
addslashes($profile),
addslashes($reseller_id)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->num_rows()) {
$query = sprintf(
"update billing_profiles set
rate_name1 = '%s',
rate_name2 = '%s',
rate_name3 = '%s',
rate_name4 = '%s',
hour1 = '%s',
hour2 = '%s',
hour3 = '%s',
hour4 = '%s'
where name = '%s'
and reseller_id= '%s'
\n",
addslashes($rate1),
addslashes($rate2),
addslashes($rate3),
addslashes($rate4),
addslashes($hour1),
addslashes($hour2),
addslashes($hour3),
addslashes($hour4),
addslashes($profile),
addslashes($reseller_id)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows()) {
$updated++;
}
} else {
$query = sprintf(
"insert into billing_profiles
(
reseller_id,
name,
rate_name1,
hour1,
rate_name2,
hour2,
rate_name3,
hour3,
rate_name4,
hour4
) values (
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s',
'%s'
)",
addslashes($reseller_id),
addslashes($profile),
addslashes($rate1),
addslashes($hour1),
addslashes($rate2),
addslashes($hour2),
addslashes($rate3),
addslashes($hour3),
addslashes($rate4),
addslashes($hour4)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if ($this->db->affected_rows() >0) {
$inserted++;
} else {
$failed++;
}
}
}
$this->showImportProgress($file);
$i++;
}
if ($i) print "Read $i records\n";
if ($inserted) print "Inserted $inserted records\n";
if ($updated) print "Updated $updated records\n";
if ($deleted) print "Delete $deleted records\n";
$results = $inserted + $updated + $deleted;
return $results;
}
public function LoadRatingTables()
{
$log = sprintf(
"Memory usage: %0.2fMB, memory limit: %sB",
memory_get_usage() / 1024 / 1024,
ini_get('memory_limit')
);
syslog(LOG_NOTICE, $log);
$loaded['profiles'] = $this->LoadProfilesTable();
$loaded['ratesHistory'] = $this->LoadRatesHistoryTable();
$loaded['holidays'] = $this->LoadHolidaysTable();
$loaded['enumTlds'] = $this->LoadENUMtldsTable();
foreach (array_keys($loaded) as $_load) {
syslog(LOG_NOTICE, "Loaded $loaded[$_load] $_load into memory");
}
$log = sprintf(
"Memory usage: %0.2fMB, memory limit: %sB",
memory_get_usage() / 1024 / 1024,
ini_get('memory_limit')
);
syslog(LOG_NOTICE, $log);
return $loaded;
}
private function LoadENUMtldsTable()
{
$query = "select * from billing_enum_tlds";
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$i=0;
$rows=$this->db->num_rows();
while ($this->db->next_record()) {
if ($this->db->Record['enum_tld']) {
$i++;
$_app=$this->db->Record['application'];
if (!$_app) $_app='audio';
$_ENUMtlds[$this->db->Record['enum_tld']] = array(
"discount" => $this->db->Record['discount'],
"e164_regexp" => $this->db->Record['e164_regexp']
);
}
}
$this->ENUMtlds = $_ENUMtlds;
$this->ENUMtldsCount = $i;
return $i;
}
private function LoadRatesHistoryTable()
{
$query = "select *,
UNIX_TIMESTAMP(startDate) as startDateTimestamp,
UNIX_TIMESTAMP(endDate) as endDateTimestamp
from billing_rates_history
order by name ASC,destination ASC,startDate DESC";
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$i=0;
$rows=$this->db->num_rows();
while ($this->db->next_record()) {
if ($this->db->Record['name'] && $this->db->Record['destination']) {
$i++;
$_app = $this->db->Record['application'];
if (!$_app) $_app='audio';
$_rates[$this->db->Record['name']][$this->db->Record['destination']][$_app][$this->db->Record['id']]=
array(
"connectCost" => $this->db->Record['connectCost'],
"durationRate" => $this->db->Record['durationRate'],
"connectCostIn" => $this->db->Record['connectCostIn'],
"durationRateIn" => $this->db->Record['durationRateIn'],
"increment" => $this->db->Record['increment'],
"min_duration" => $this->db->Record['min_duration'],
"startDate" => $this->db->Record['startDateTimestamp'],
"endDate" => $this->db->Record['endDateTimestamp']
);
}
}
$this->ratesHistory = $_rates;
$this->ratesHistoryCount = $i;
return $i;
}
private function LoadProfilesTable()
{
$query = "select * from billing_profiles order by name";
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$i=0;
while ($this->db->next_record()) {
$i++;
if ($this->db->Record['name'] && $this->db->Record['hour1'] > 0) {
$_profiles[$this->db->Record['name']]=
array(
"rate_name1" => $this->db->Record['rate_name1'],
"hour1" => $this->db->Record['hour1'],
"rate_name2" => $this->db->Record['rate_name2'],
"hour2" => $this->db->Record['hour2'],
"rate_name3" => $this->db->Record['rate_name3'],
"hour3" => $this->db->Record['hour3'],
"rate_name4" => $this->db->Record['rate_name4'],
"hour4" => $this->db->Record['hour4'],
);
}
}
$this->profiles=$_profiles;
return $i;
}
private function LoadHolidaysTable()
{
$query="select * from billing_holidays order by day";
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$i=0;
while ($this->db->next_record()) {
if ($this->db->Record['day']) {
$i++;
$_holidays[$this->db->Record['day']]++;
}
}
$this->holidays=$_holidays;
return $i;
}
public function checkRatingEngineConnection()
{
if ($this->settings['socketIPforClients'] && $this->settings['socketPort']
&& $fp = fsockopen($this->settings['socketIPforClients'], $this->settings['socketPort'], $errno, $errstr, 2)
) {
fclose($fp);
return true;
}
return false;
}
function showCustomers($filter)
{
return true;
foreach (array_keys($this->customers) as $key) {
if (strlen($filter)) {
if (preg_match("/$filter/", $key)) {
$customers = $customers.$key."\n";
}
} else {
$customers = $customers.$key."\n";
}
}
return $customers;
}
public function showProfiles()
{
foreach (array_keys($this->profiles) as $key) {
$profiles=$profiles.$key."\n";
}
return $profiles;
}
public function showENUMtlds()
{
foreach (array_keys($this->ENUMtlds) as $key) {
$ENUMtlds=$ENUMtlds.$key."\n";
}
return $ENUMtlds;
}
private function scanFilesForImport($dir)
{
$import_dirs[$this->cvs_import_dir] = array(
'path' => $this->cvs_import_dir,
'reseller' => 0
);
if ($handle = opendir($this->cvs_import_dir)) {
while (false !== ($filename = readdir($handle))) {
$reseller=0;
if ($filename == "." || $filename == "..") continue;
$fullPath = $this->cvs_import_dir."/".$filename;
if (is_dir($fullPath) && is_numeric($filename)) {
$reseller = $filename;
$import_dirs[$fullPath]=array(
'path' => $fullPath,
'reseller'=> $reseller
);
}
}
}
foreach (array_keys($import_dirs) as $_dir) {
if ($handle = opendir($_dir)) {
while (false !== ($filename = readdir($handle))) {
if ($filename != "." && $filename != "..") {
foreach ($this->importFilesPatterns as $_pattern) {
if (strstr($filename, $_pattern) && preg_match("/\.csv$/", $filename)) {
$fullPath = $_dir."/".$filename;
if ($content = file_get_contents($fullPath)) {
$watermark = $filename."-".md5($content);
if ($this->hasFileBeenImported($filename, $watermark)) {
$this->previously_imported_files++;
break;
}
$this->filesToImport[$filename] = array(
'name' => $filename,
'watermark' => $watermark,
'type' => $_pattern,
'path' => $fullPath,
'reseller' => $import_dirs[$_dir]['reseller']
);
}
break;
}
}
}
}
}
}
}
private function hasFileBeenImported($filename, $watermark)
{
$query = sprintf(
"select * from log where url = '%s'\n",
addslashes($watermark)
);
if ($this->db->query($query)) {
if ($this->db->num_rows()) {
$this->db->next_record();
/*
$log=sprintf ("File %s has already been imported at %s.\n",$filename,$this->db->f('date'));
syslog(LOG_NOTICE, $log);
print $log;
*/
return true;
} else {
return false;
}
} else {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
}
private function logImport($dir, $filename, $watermark, $results = 0, $reseller = 0)
{
$query = sprintf(
"insert into log (
date,
login,
ip,
url,
results,
description,
datasource,
reseller_id
) values (
NOW(),
'ImportScript',
'localhost',
'%s',
'%s',
'Imported %s',
'%s',
%d
)",
addslashes($watermark),
addslashes($results),
addslashes($filename),
addslashes($dir),
addslashes($reseller)
);
$log = sprintf(
"Imported file %s, %d records have been affected\n",
$filename,
$results
);
syslog(LOG_NOTICE, $log);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
}
function showImportProgress($filename = 'unspecified', $increment = 5000)
{
$this->importIndex++;
if ($this->importIndex == $increment) {
printf("Loaded %d records from %s\n", $this->importIndex, $filename);
flush();
$this->importIndex=0;
}
}
function createRatingTable($name)
{
if ($name) {
$table='billing_rates_'.$name;
} else {
$table='billing_rates_default';
}
$query = sprintf(
"create table %s select * from billing_rates where name = '%s'\n",
addslashes($table),
addslashes($name)
);
if ($this->db->query($query)) {
$query = sprintf(
"alter table %s add index rate_idx (name)",
addslashes($table)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
$query = sprintf(
"alter table %s add index destination_idx (destination)",
addslashes($table)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
printf("Created table %s\n", $table);
return true;
} else {
return false;
}
}
public function splitRatingTable()
{
$query = "select count(*) as c from billing_rates";
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$this->db->next_record();
$rows=$this->db->f('c');
$query="select distinct(name) from billing_rates order by name ASC";
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
while ($this->db->next_record()) {
$rate_names[]=$this->db->f('name');
}
foreach ($rate_names as $name) {
if (!$name) $name='default';
$table="billing_rates_".$name;
$query = sprintf("drop table if exists %s", addslashes($table));
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$query = sprintf(
"create table %s select * from billing_rates where name = '%s'\n",
addslashes($table),
addslashes($name)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
} else {
$query = sprintf(
"alter table %s add index rate_idx (name)",
addslashes($table)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$query = sprintf(
"alter table %s add index destination_idx (destination)",
addslashes($table)
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
return false;
}
$query = sprintf("select count(*) as c from %s", addslashes($table));
$this->db->query($query);
$this->db->next_record();
$records=$this->db->f('c');
$created_records=$created_records+$records;
$progress=100*$created_records/$rows;
printf(
"Created table %s with %s records (%.1f %s)\n",
$table,
$records,
$progress,
'%'
);
}
}
return true;
}
public function updateTable()
{
global $auth;
$loginname=$auth->auth["uname"];
foreach ($this->web_elements as $_el) {
${$_el}= $_REQUEST[$_el];
}
if (!$table) return false;
if ($this->readonly) {
return true;
}
// Init table structure
if (!is_array($this->tables[$table]['exceptions'])) $this->tables[$table]['exceptions']=array();
if (!is_array($this->tables[$table]['keys'])) $this->tables[$table]['keys']=array();
if (!is_array($this->tables[$table]['fields'])) $this->tables[$table]['fields']=array();
$metadata = $this->db->metadata($table = "$table");
$cc = count($metadata);
// end init table structure
if ($web_task =="update") {
$affected_rows=0;
if ($subweb_task == "Update") {
if ($this->checkValues($table, $_REQUEST)) {
$update_set='';
$k=0;
while ($k < $cc) {
$k++;
$Fname=$metadata[$k]['name'];
if (!$Fname) continue;
$value=$_REQUEST[$Fname];
if ($this->tables[$table]['fields'][$Fname]['readonly']) {
continue;
}
if (in_array($Fname, $this->tables[$table]['exceptions'])) {
continue;
}
if (in_array($Fname, $this->tables[$table]['keys'])) {
continue;
}
if ($kkk > 0) {
$comma = ",";
} else {
$comma = "";
}
if (!$this->tables[$table]['skip_math'] && preg_match("/^([\+\-\*\/])(.*)$/", $value, $sign)) {
$update_set .= $comma.addslashes($Fname)."= ROUND(".addslashes($Fname). " ".$sign[1]. "'".$sign[2]."')";
} else {
$update_set .= $comma.addslashes($Fname)."='".addslashes($value)."'";
}
$kkk++;
}
$k=0;
while ($k < $cc) {
if ($metadata[$k]['name'] == 'change_date') {
$update_set .= sprintf("%s %s = NOW() ", $comma, addslashes($metadata[$k]['name']));
break;
}
$k++;
}
$log_entity=" id = $id ";
$where = sprintf(" id = '%s' and %s", addslashes($id), $this->whereResellerFilter);
if ($table == "billing_rates") {
if ($this->settings['split_rating_table']) {
$rate_table_affected = array();
$query_r = "select distinct (name) from billing_rates where". $where;
if ($this->db->query($query_r)) {
while ($this->db->next_record()) {
$rate_tables_affected[]='billing_rates_'.$this->db->f('name');
}
} else {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
}
} elseif ($table=="prepaid") {
register_shutdown_function("unLockTables", $this->db);
if ($this->db->query("lock table prepaid write")) {
$query_q = sprintf(
"select * from prepaid where account = '%s'",
addslashes($account)
);
if ($this->db->query($query_q) && $this->db->num_rows()) {
$this->db->next_record();
$old_balance=$this->db->f('balance');
}
$this->db->query("unlock tables");
}
}
$query = sprintf(
"update %s set %s where %s ",
addslashes($table),
$update_set,
$where
);
if ($this->db->query($query)) {
$affected_rows=$this->db->affected_rows();
if ($affected_rows) {
if ($table=="prepaid") {
list($username, $domain) = explode("@", $account);
$value=$balance-$old_balance;
if (floatval($balance) != floatval($old_balance)) {
$query = sprintf(
"insert into prepaid_history
(username,domain,action,description,value,balance,date,reseller_id)
values
('%s','%s','Set balance','Manual update','%s','%s',NOW(),%d)",
addslashes($username),
addslashes($domain),
addslashes($value),
addslashes($balance),
$this->CDRTool['filter']['reseller']
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
}
} elseif ($table=='billing_rates') {
if ($this->settings['split_rating_table']) {
foreach ($rate_tables_affected as $extra_rate_table) {
$query_u = sprintf(
"update %s set %s where %s ",
addslashes($extra_rate_table),
$update_set,
$where
);
if (!$this->db->query($query_u)) {
$log = sprintf(
"Database error for query %s: %s (%s)",
$query_u,
$this->db->Error,
$this->db->Errno
);
print $log;
syslog(LOG_NOTICE, $log);
}
}
}
}
if (in_array($table, $this->requireReload)) {
if (!$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'")) {
printf(
"Database error: %s (%s) ",
$this->db->Error,
$this->db->Errno
);
}
}
}
} else {
printf(
"Database error for query '%s': %s (%s) ",
$query,
$this->db->Error,
$this->db->Errno
);
}
} else {
print "Correct the values and try again.";
}
} elseif ($subweb_task == "Update selection") {
$k=0;
$kkk=0;
$update_set='';
while ($k < $cc) {
$k++;
$Fname=$metadata[$k]['name'];
$value=$_REQUEST[$Fname];
if (!strlen($value)) continue;
if ($this->tables[$table]['fields'][$Fname]['readonly']) {
continue;
}
if (in_array($Fname, $this->tables[$table]['exceptions'])) {
continue;
}
if (in_array($Fname, $this->tables[$table]['keys'])) {
continue;
}
if ($kkk > 0) {
$comma = ",";
} else {
$comma="";
}
if ($value == "NULL") {
$value="";
}
if (preg_match("/^([\+\-\*\/])(.*)$/", $value, $sign)) {
$update_set .= $comma.$Fname." = ROUND(".$Fname. " ".$sign[1]. "'".$sign[2]."')";
} else {
$update_set .= $comma.$Fname." = '".$value."'";
}
$kkk++;
}
$where = $this->whereResellerFilter;
if ($kkk) {
// reconstruct where clause to apply all changes to selection
// build where clause
// Search build for each field
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$table]['exceptions'])) {
$f_name="search_".$Fname;
$value=$_REQUEST[$f_name];
if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) {
$like=$likes[1];
$likewhat=$likes[2];
$quotes="";
} else {
$like="like";
$likewhat=$value;
$quotes="'";
}
if (strlen($value)) {
$where .= " and $Fname $like $quotes".$likewhat."$quotes";
$t++;
}
}
$j++;
}
if ($table == 'billing_rates') {
if ($this->settings['split_rating_table']) {
$rate_table_affected = array();
$query_r = "select distinct (name) from billing_rates where". $where;
if ($this->db->query($query_r)) {
while ($this->db->next_record()) {
$rate_tables_affected[] = 'billing_rates_'.$this->db->f('name');
}
} else {
printf(
"Database error: %s (%s) ",
$this->db->Error,
$this->db->Errno
);
}
}
}
$query = sprintf(
"update %s set %s where %s ",
addslashes($table),
$update_set,
$where
);
if ($this->db->query($query)) {
$affected_rows=$this->db->affected_rows();
if ($affected_rows) {
if ($table == 'billing_rates') {
if ($this->settings['split_rating_table']) {
foreach ($rate_tables_affected as $extra_rate_table) {
$query_u = sprintf(
"update %s set %s where %s ",
addslashes($extra_rate_table),
$update_set,
$where
);
if (!$this->db->query($query_u)) {
printf(
"Database error for %s: %s (%s) ",
$query_u,
$this->db->Error,
$this->db->Errno
);
}
}
}
}
if (in_array($table, $this->requireReload)) {
$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'");
}
}
} else {
printf("Database error: %s ", $this->db->Error);
}
}
} elseif ($subweb_task == "Delete selection") {
if ($confirmDelete) {
// reconstruct where clause to apply all changes to selection
// build where clause
// Search build for each field
$where = $this->whereResellerFilter;
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$table]['exceptions'])) {
$f_name="search_".$Fname;
$value=$_REQUEST[$f_name];
if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) {
$like = $likes[1];
$likewhat = $likes[2];
$quotes = "";
} else {
$like = "like";
$likewhat = $value;
$quotes = "'";
}
if (strlen($value)) {
$where .= " and $Fname $like $quotes".$likewhat."$quotes";
$t++;
}
}
$j++;
}
if ($table == 'billing_rates') {
if ($this->settings['split_rating_table']) {
$rate_table_affected=array();
$query_r = "select distinct (name) from billing_rates where". $where;
if ($this->db->query($query_r)) {
while ($this->db->next_record()) {
$rate_tables_affected[] = 'billing_rates_'.$this->db->f('name');
}
} else {
printf(
"Database error: %s (%s) ",
$this->db->Error,
$this->db->Errno
);
}
}
}
$query = sprintf(
"delete from %s where %s",
addslashes($table),
$where
);
if ($this->db->query($query)) {
$affected_rows = $this->db->affected_rows();
if ($affected_rows) {
if ($table == 'billing_rates') {
if ($this->settings['split_rating_table']) {
foreach ($rate_tables_affected as $extra_rate_table) {
$query_u = sprintf(
"delete from %s where %s ",
addslashes($extra_rate_table),
$where
);
if (!$this->db->query($query_u)) {
printf(
"Database error for %s: %s (%s) ",
$query_u,
$this->db->Error,
$this->db->Errno
);
}
}
}
}
if (in_array($table, $this->requireReload)) {
$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'");
}
}
} else {
printf(
"Database error: %s ",
$this->db->Error
);
}
unset($confirmDelete);
} else {
print "
";
print "Please confirm the deletion by pressing the Delete button again. ";
print " ";
print " ";
}
} elseif ($subweb_task == "Copy rate" && strlen($fromRate) && strlen($toRate)) {
$toRate=preg_replace("/%/", "", $toRate);
if ($confirmCopy) {
if ($toRate == 'history') {
$values = sprintf(
"(reseller_id,name,destination,application,connectCost,durationRate,connectCostIn,durationRateIn,startDate,endDate)
select
billing_rates.reseller_id,
'%s',
billing_rates.destination,
billing_rates.application,
billing_rates.connectCost,
billing_rates.durationRate,
billing_rates.connectCostIn,
billing_rates.durationRateIn,
NOW(),
NOW()
from billing_rates ",
addslashes($fromRate)
);
} else {
$values = sprintf(
"(reseller_id,name,destination,application,connectCost,durationRate,connectCostIn,durationRateIn)
select
billing_rates.reseller_id,
'%s',
billing_rates.destination,
billing_rates.application,
billing_rates.connectCost,
billing_rates.durationRate,
billing_rates.connectCostIn,
billing_rates.durationRateIn
from billing_rates ",
addslashes($toRate)
);
}
$where = $this->whereResellerFilter;
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$table]['exceptions'])) {
$f_name="search_".$Fname;
$value=$_REQUEST[$f_name];
if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) {
$like=$likes[1];
$likewhat=$likes[2];
$quotes="";
} else {
$like="like";
$likewhat=$value;
$quotes="'";
}
if (strlen($value)) {
$where .= sprintf(
" and %s %s %s%s%s ",
addslashes($Fname),
$like,
$quotes,
addslashes($likewhat),
$quotes
);
$t++;
}
}
$j++;
}
if ($toRate == 'history') {
$query="insert into billing_rates_history $values where $where";
} else {
$query="insert into billing_rates $values where $where";
}
if ($this->db->query($query)) {
$affected_rows=$this->db->affected_rows();
if ($affected_rows) {
print "$affected_rows rates copied. ";
if ($table == 'billing_rates') {
if ($this->settings['split_rating_table']) {
$query = sprintf(
"create table billing_rates_%s select * from billing_rates where %s ",
addslashes($toRate),
$where
);
if (!$this->db->query($query)) {
printf(
"Database error for %s: %s (%s) ",
$query,
$this->db->Error,
$this->db->Errno
);
}
}
}
if (in_array($table, $this->requireReload)) {
$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'");
}
}
if ($toRate == 'history') {
// Switch to history
$table = 'billing_rates_history';
// Init table structure
$this->tables[$table]['exceptions']= $this->tables[$table]['exceptions'];
$this->tables[$table]['keys'] = $this->tables[$table]['keys'];
$this->tables[$table]['fields'] = $this->tables[$table]['fields'];
$metadata = $this->db->metadata($table = "$table");
$cc = count($metadata);
// end init table structure
}
unset($confirmCopy);
} else {
printf("Database error: %s ", $this->db->Error);
}
$log_entity="rate=$toRate";
} else {
print "
";
print "Please confirm the copy of rate $fromRate to $toRate. ";
print " ";
}
} elseif ($subweb_task == "Insert") {
//print "
Insert ";
if ($this->checkValues($table, $_REQUEST)) {
$query=sprintf("insert into %s ( ", addslashes($table));
$k=1;
$kkk=0;
while ($k < $cc) {
$Fname=$metadata[$k]['name'];
if (!in_array($Fname, $this->tables[$table]['exceptions'])) {
if ($kkk > 0) {
$comma = ",";
} else {
$comma="";
}
$query .= $comma.addslashes($Fname);
$kkk++;
}
$k++;
}
$query .= ") values ( ";
$k=1;
$kkk=0;
while ($k < $cc) {
$Fname=$metadata[$k]['name'];
$value=$_REQUEST[$Fname];
if (!in_array($Fname, $this->tables[$table]['exceptions'])) {
if ($kkk > 0) {
$comma = ",";
} else {
$comma="";
}
if ($Fname == 'reseller_id' && $this->CDRTool['filter']['reseller']) {
$query .= $comma."'".addslashes($this->CDRTool['filter']['reseller'])."'";
} else {
$query .= $comma."'".addslashes($value)."'";
}
$kkk++;
}
$k++;
}
$query .= ") ";
$k=1;
while ($k < $cc) {
$Fname=$metadata[$k]['name'];
$value=$_REQUEST[$Fname];
if (in_array($Fname, $this->tables[$table]['keys'])) {
if ($value == "") {
$Fname_print_insert = substr($Fname, 4);
print "$Fname_print_insert = ???? ";
$empty_insert = 1;
}
}
$k++;
}
if (!$empty_insert) {
if ($this->db->query($query)) {
$affected_rows=$this->db->affected_rows();
if ($affected_rows) {
$this->db->query("select LAST_INSERT_ID() as lid");
$this->db->next_record();
$log_entity = sprintf("id=%s", $this->db->f('lid'));
if (in_array($table, $this->requireReload)) {
$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'");
}
}
} else {
printf(
"Database error for query %s: %s (%s) ",
$query,
$this->db->Error,
$this->db->Errno
);
}
} else {
print "
Error: The insert statement contains an empty key!
";
}
} else {
print "Correct the values and try again.";
}
} elseif ($subweb_task == "Delete") {
if ($confirmDelete) {
$query = sprintf(
"delete from %s where id = '%s' and %s ",
addslashes($table),
addslashes($id),
addslashes($this->whereResellerFilter)
);
if ($this->db->query($query)) {
$affected_rows=$this->db->affected_rows();
if ($affected_rows && in_array($table, $this->requireReload)) {
$this->db->query("update settings set var_value= '1' where var_name = 'reloadRating'");
}
$log_entity = sprintf("id=%s", $id);
} else {
printf("Database error: %s ", $this->db->Error);
}
unset($confirmDelete);
} else {
$idForDeletion=$id;
print "
";
print "Please confirm the deletion by pressing the Delete button again. ";
print " ";
print " ";
}
} elseif ($subweb_task == "Delete session" && $sessionId && $table=='prepaid') {
$query = sprintf(
"select active_sessions from %s where id = %d and %s",
addslashes($table),
addslashes($id),
$this->whereResellerFilter
);
if (!$this->db->query($query)) {
$log = sprintf(
"Database error for %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
print $log;
}
if (!$this->db->num_rows()) return;
$this->db->next_record();
if (strlen($this->db->f('active_sessions'))) {
// remove session
$active_sessions=array();
$old_active_sessions = json_decode($this->db->f('active_sessions'), true);
if (!count($old_active_sessions)) return;
foreach (array_keys($old_active_sessions) as $_key) {
if ($_key==$sessionId) continue;
$active_sessions[$_key]=$old_active_sessions[$_key];
}
} else {
$active_sessions=array();
}
$query = sprintf(
"update %s
set active_sessions = '%s',
session_counter = %d
where id = %d",
addslashes($table),
addslashes(json_encode($active_sessions)),
count($active_sessions),
addslashes($id)
);
if ($this->db->query($query)) {
return 1;
} else {
$log = sprintf(
"Database error for %s: %s (%s)",
$query,
$this->db->Error,
$this->db->Errno
);
syslog(LOG_NOTICE, $log);
print $log;
return 0;
}
}
if ($affected_rows && $table!="prepaid") {
$log_query = sprintf(
"insert into log
(date,login,ip,datasource,results,description,reseller_id)
values (NOW(),'%s','%s','Rating','%d','%s in table %s %s',%d)",
addslashes($loginname),
addslashes($_SERVER['REMOTE_ADDR']),
addslashes($affected_rows),
addslashes($subweb_task),
addslashes($table),
addslashes($log_entity),
addslashes($this->CDRTool['filter']['reseller'])
);
$this->db->query($log_query);
}
}
}
public function showTable()
{
$PHP_SELF=$_SERVER['PHP_SELF'];
foreach ($this->web_elements as $_el) {
${$_el}= $_REQUEST[$_el];
}
if ($this->table == 'prepaid_cards') {
print "
Prepaid card generator ";
}
// Init table structure
if (!is_array($this->tables[$this->table]['exceptions'])) $this->tables[$this->table]['exceptions']=array();
if (!is_array($this->tables[$this->table]['keys'])) $this->tables[$this->table]['keys']=array();
if (!is_array($this->tables[$this->table]['fields'])) $this->tables[$this->table]['fields']=array();
if ($this->table=='prepaid' && strlen($_REQUEST['search_session_counter'])) {
$this->readonly=true;
}
if ($this->readonly) {
$this->tables[$this->table]['readonly']=1;
}
$metadata = $this->db->metadata($this->table);
$cc = count($metadata);
// end init table structure
//
// delimiter for exporting records
if ($this->settings['csv_delimiter']) {
$delimiter=$this->settings['csv_delimiter'];
} else {
$delimiter=",";
}
$query = sprintf(
"select count(*) as c from %s where %s",
addslashes($this->table),
$this->whereResellerFilter
);
$t=0;
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
$class=$metadata[$j]['class'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$f_name="search_".$Fname;
$value=$_REQUEST[$f_name];
if (preg_match("/^([<|>]+)(.*)$/", $value, $likes)) {
$like=$likes[1];
$likewhat=$likes[2];
$quotes="";
} else {
$like="like";
$likewhat=$value;
$quotes="'";
}
if (strlen($value)) {
$where .= sprintf(
" and %s %s %s%s%s ",
addslashes($Fname),
$like,
$quotes,
addslashes($likewhat),
$quotes
);
$t++;
}
}
$j++;
}
$query .= $where;
$this->db->query($query);
$this->db->next_record();
$rows=$this->db->Record['c'];
if (!$export) {
print "
";
if ($rows == 0) {
print "No records found. ";
} else {
print "$selectie $rows records found. ";
}
if ($this->settings['socketIPforClients'] && $this->settings['socketPort']) {
$engineAddress = $this->settings['socketIPforClients'].":".$this->settings['socketPort'];
if ($this->checkRatingEngineConnection()) {
print " | Rating engine running at $engineAddress ";
} else {
print " | Cannot connect to rating engine $engineAddress ";
}
}
print " | Rating documentation ";
print "
";
if ($this->csv_import[$this->table]) {
print "
";
printf(
"
",
$this->table,
$this->table
);
print "
";
} else {
print " ";
}
print "
";
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME="search_".$Fname;
$value=$_REQUEST[$SEARCH_NAME];
print " ";
}
$j++;
}
if ($this->table!=='prepaid_cards') {
printf(
"
Export %s
",
$this->table,
$this->csv_export[$this->table],
$this->csv_export[$this->table]
);
}
if ($this->settings['socketIPforClients'] && $this->settings['socketPort']) {
if ($ReloadRatingTables) {
reloadRatingEngineTables();
} else {
$this->db->query("select var_value from settings where var_name = 'reloadRating' and var_value='1'");
if ($this->db->num_rows()) {
print "table>Reload rating tables ";
}
}
}
print "
";
} else {
$this->maxrowsperpage = 10000000;
}
if (!$next) {
$i=0;
$next=0;
} else {
$i=intval($next);
}
$j=0;
$z=0;
if ($rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $next;
if ($maxrows > $rows) {
$maxrows=$rows;
$prev_rows=$maxrows;
}
} else {
$maxrows=$rows;
}
if (!$order && $this->tables[$this->table]['order']) {
$order = sprintf(
" order by %s ",
addslashes($this->tables[$this->table]['order'])
);
}
$query = sprintf(
"select * from %s where (1=1) %s and %s %s limit %d, %d",
addslashes($this->table),
$where,
$this->whereResellerFilter,
$order,
intval($i),
intval($this->maxrowsperpage)
);
$this->db->query($query);
$num_fields=$this->db->num_fields();
$k=0;
if (!$export) {
if ($this->table=='prepaid') {
print "
";
} else {
print "
";
}
}
while ($k < $cc) {
$th = $metadata[$k]['name'];
if (!in_array($th, $this->tables[$this->table]['exceptions'])) {
if ($this->tables[$this->table]['fields'][$th]['name']) {
$th=$this->tables[$this->table]['fields'][$th]['name'];
} else {
$th=ucfirst($th);
}
if (!$export) {
print "$th ";
} else {
if ($k) {
printf("%s%s", $delimiter, $th);
} else {
print "Ops";
}
}
$t_columns++;
}
$k++;
}
if ($export) {
print "\n";
}
if (!$export) {
print "
Action
";
$t_columns=$t_columns+2;
// SEARCH FORM
print "
Use _ to match one character and % to match any. Use > or <
to find greater or smaller values.
";
// Search form
print "
";
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME = "search_".$Fname;
$value = $_REQUEST[$SEARCH_NAME];
if ($value != "") {
$selection_made=1;
}
$maxlength=$size;
if ($this->tables[$this->table]['fields'][$Fname]['size']) {
$field_size = $this->tables[$this->table]['fields'][$Fname]['size'];
} else {
$field_size = $el_size;
}
$class=$this->tables[$this->table]['fields'][$Fname]['class'];
if (!in_array($Fname, $this->tables[$this->table]['keys'])) {
if (!$class) {
$class = "span1";
}
print " ";
} else {
print " ";
}
}
$j++;
}
printf(
"
",
$PHP_SELF
);
print "
";
print("\n");
$selected_table[$this->table]="selected";
foreach (array_keys($this->tables) as $tb) {
$sel_name=$this->tables[$tb]['name'];
print "$sel_name";
}
print "
";
print "
";
//print "
//
//
//
//";
if ($selection_made && !$this->tables[$this->table]['readonly']) {
// Update all form
print "
Use + or - to add/substract from curent values.
Use * or / to multiply/divide curent values.
";
$j=0;
print "
";
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if ($this->tables[$this->table]['fields'][$Fname]['size']) {
$field_size=$this->tables[$this->table]['fields'][$Fname]['size'];
} else {
$field_size=$el_size;
}
$class=$this->tables[$this->table]['fields'][$Fname]['class'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
if (!in_array($Fname, $this->tables[$this->table]['keys'])) {
if (!$class) {
$class="span1";
}
print " ";
} else {
print " ";
}
}
$j++;
}
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME="search_".$Fname;
$value=$_REQUEST[$SEARCH_NAME];
print " ";
}
$j++;
}
if ($subweb_task=="Delete selection" && !$confirmDelete) {
print "";
print " ";
print " ";
print " ($rows records)";
} elseif (!$this->tables[$this->table]['readonly']) {
if ($this->table == "billing_rates" && strlen($_REQUEST['search_name'])) {
if ($subweb_task=="Copy rate" && !$confirmCopy) {
print " ";
print " ";
} else {
print " ";
print "
";
}
print "
";
printf(" id %s to", $_REQUEST['search_name']);
$query = sprintf(
"select distinct(name) as name
from billing_rates where
name like '%s'
order by name DESC
limit 1",
addslashes($_REQUEST['search_name'])
);
$this->db1->query($query);
$this->db1->next_record();
$_rateName = $this->db1->f('name');
$_rateName = preg_replace("/%/", "", $_rateName);
if (preg_match("/^(.*)_(\d+)$/", $_rateName, $m)) {
$_idx = $m[2] + 1;
$newRateName = $m[1]."_".$_idx;
} else {
$newRateName = $_rateName."_1";
}
printf(
" ",
$_REQUEST['search_name']
);
$selected_newtable[$toRate]='selected';
printf(
"
Rate id %s
Rate history table
",
$newRateName,
$selected_newtable[$newRateName],
$newRateName,
$selected_newtable['history']
);
} else {
print " ";
print "
";
}
}
print "
table>
";
} elseif (!$this->tables[$this->table]['readonly']) {
// Insert form
$j=0;
print "
";
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if ($this->tables[$this->table]['fields'][$Fname]['size']) {
$field_size=$this->tables[$this->table]['fields'][$Fname]['size'];
} else {
$field_size=$el_size;
}
$class=$this->tables[$this->table]['fields'][$Fname]['class'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
if (!in_array($Fname, $this->tables[$this->table]['keys'])) {
if (!$class) {
$class='span1';
}
print " ";
} else {
print " ";
}
}
$j++;
}
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME = "search_".$Fname;
$value = $_REQUEST[$SEARCH_NAME];
print " ";
}
$j++;
}
print "
table\">
";
//print "
//
//
//
//";
}
}
while ($i < $maxrows) {
$this->db->next_record();
$id = $this->db->f('id');
$status = $this->db->f('status');
$found = $i+1;
if (!$export) {
print "
";
if ($this->table == 'prepaid') {
$active_sessions = json_decode($this->db->f('active_sessions'), true);
if (!isset($active_sessions)) {
$active_sessions = array();
}
$account=$this->db->f('account');
$extraInfo="
",
$this->table,
$next,
$_session,
$search_text
);
}
print "$found. ";
}
$j=0;
while ($j < $this->db->num_fields()) {
$value=$this->db->Record[$metadata[$j]['name']];
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
$class=$metadata[$j]['class'];
if ($this->tables[$this->table]['fields'][$Fname]['size']) {
$field_size=$this->tables[$this->table]['fields'][$Fname]['size'];
} else {
$field_size=$el_size;
}
$class=$this->tables[$this->table]['fields'][$Fname]['class'];
if ($this->tables[$this->table]['fields'][$Fname]['readonly']=="1") {
$extra_form_els = "disabled=true";
} else {
$extra_form_els = "";
}
$class=$this->tables[$this->table]['fields'][$Fname]['class'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
if (!$export) {
if (!in_array($Fname, $this->tables[$this->table]['keys']) && !$this->readonly) {
if ($this->table == 'prepaid' && $Fname == 'session_counter' && $value) {
if (count($active_sessions) > 1) {
$session_counter_txt = sprintf("%d sessions", $value);
} else {
$session_counter_txt = sprintf("%d session", $value);
}
printf(
"%s ",
$found,
$session_counter_txt
);
} else {
if (!$class) {
$class="span1";
}
print "
";
}
} else {
if ($this->table == 'prepaid' && $Fname == 'session_counter' && $value) {
if (count($active_sessions) > 1) {
$session_counter_txt = sprintf("%d sessions", $value);
} else {
$session_counter_txt = sprintf("%d session", $value);
}
printf(
"%s ",
$found,
$session_counter_txt
);
} else {
print "$value ";
}
}
} else {
if ($j) {
printf("%s%s", $delimiter, $value);
} else {
print "2";
}
}
}
$j++;
}
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME = "search_".$Fname;
$value=$_REQUEST[$SEARCH_NAME];
if (!$export) {
print " ";
}
}
$j++;
}
if ($export) {
print "\n";
}
if (!$export) {
if (!$this->tables[$this->table]['readonly']) {
if ($subweb_task=="Delete" && $idForDeletion == $id && !$confirmDelete) {
print "";
print " ";
print " ";
} else {
print "
";
print " ";
}
print "
table>
";
if ($extraInfo!='') {
print "
$extraInfo
";
}
} else {
if ($this->table == 'prepaid') {
print "
$extraInfo
";
}
}
}
$i++;
}
if (!$export) {
print "
";
print "";
if ($next != 0) {
$show_next = $this->maxrowsperpage - $next;
if ($show_next < 0) {
$mod_show_next = $show_next - 2 * $show_next;
print " ";
}
print "
maxrowsperpage>
table>
";
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME="search_".$Fname;
$value=$_REQUEST[$SEARCH_NAME];
print "
";
}
$j++;
}
}
print "
";
if ($rows>$this->maxrowsperpage && $rows!=$maxrows) {
$show_next = $this->maxrowsperpage + $next;
print "
maxrowsperpage>
table>
";
$j=0;
while ($j < $cc) {
$Fname=$metadata[$j]['name'];
$size=$metadata[$j]['len'];
if (!in_array($Fname, $this->tables[$this->table]['exceptions'])) {
$SEARCH_NAME="search_".$Fname;
$value=$_REQUEST[$SEARCH_NAME];
print " ";
}
$j++;
}
print "
";
}
print "
";
print "